Ich habe zwei in Java geschriebene Anwendungen, die über XML-Nachrichten über das Netzwerk miteinander kommunizieren. Ich verwende einen SAX-Parser am empfangenden Ende, um die Daten aus den Nachrichten zurückzugewinnen. Eine der Anforderungen ist das Einbetten von Binärdaten in eine XML-Nachricht, aber SAX gefällt das nicht. Weiß jemand, wie man das macht?
UPDATE: Ich habe dies mit der Base64- Klasse aus der Apache Commons Codec-Bibliothek zum Laufen gebracht , falls jemand anderes etwas Ähnliches versucht.
quelle
Base64 ist in der Tat die richtige Antwort, CDATA jedoch nicht. Das heißt im Grunde: "Dies könnte alles sein", es muss jedoch nicht alles sein, es müssen Base64-codierte Binärdaten sein. Das XML-Schema definiert die Base 64-Binärdatei als primitiven Datentyp, den Sie in Ihrer xsd verwenden können.
quelle
xs:base64Binary
Datentyps, der der richtige Typ ist.Ich hatte dieses Problem erst letzte Woche. Ich musste eine PDF-Datei serialisieren und in einer XML-Datei an einen Server senden.
Wenn Sie .NET verwenden, können Sie eine Binärdatei direkt in eine base64-Zeichenfolge konvertieren und in ein XML-Element einfügen.
Oder es gibt eine Methode, die direkt in das XmlWriter-Objekt integriert ist. In meinem speziellen Fall musste ich den Datentyp-Namespace von Microsoft einschließen:
Der String abc sieht ungefähr so aus:
quelle
Normalerweise codiere ich die Binärdaten mit MIME Base64 oder URL-Codierung .
quelle
Versuchen Sie, Ihre Binärdaten mit Base64 zu codieren / decodieren. Schauen Sie sich auch die CDATA-Abschnitte an
quelle
Vielleicht codieren Sie sie in einen bekannten Satz - so etwas wie Base 64 ist eine beliebte Wahl.
quelle
Jede Binär-zu-Text-Codierung reicht aus . Ich benutze so etwas
quelle
Der Base64-Overhead beträgt 33%.
Der Overhead für BaseXML für XML1.0 beträgt nur 20% . Aber es ist kein Standard und hat noch nur eine C-Implementierung. Probieren Sie es aus, wenn Sie sich mit der Datengröße befassen. Beachten Sie jedoch, dass Browser dazu neigen, die Komprimierung zu implementieren, sodass sie weniger benötigt wird.
Ich habe es nach der Diskussion in diesem Thread entwickelt: Codierung von Binärdaten in XML: Alternativen zu base64 .
quelle
Während die anderen Antworten meistens in Ordnung sind, können Sie eine andere, platzsparendere Codierungsmethode wie yEnc ausprobieren. ( yEnc wikipedia link ) Mit yEnc erhalten Sie auch die Prüfsummenfunktion "out of the box". Lesen und Links unten. Da XML keinen nativen yEnc-Typ hat, sollte Ihr XML-Schema natürlich aktualisiert werden, um den codierten Knoten ordnungsgemäß zu beschreiben.
Warum : Aufgrund der Codierungsstrategien base64 / 63 haben uuencode et al. Codierungen erhöhen die Datenmenge (Overhead), die Sie zum Speichern und Übertragen benötigen, um ungefähr 40% (gegenüber 1-2% bei yEnc). Je nachdem, was Sie codieren, können 40% Overhead ein Problem sein / werden.
yEnc - Wikipedia-Zusammenfassung: https://en.wikipedia.org/wiki/YEnc yEnc ist ein Binär-Text-Codierungsschema zum Übertragen von Binärdateien in Nachrichten im Usenet oder per E-Mail. ... Ein zusätzlicher Vorteil von yEnc gegenüber früheren Codierungsmethoden wie uuencode und Base64 ist die Aufnahme einer CRC-Prüfsumme, um zu überprüfen, ob die decodierte Datei intakt geliefert wurde. .
quelle
Sie können Ihre ursprünglichen Binärdaten auch mit Uuencode versehen . Dieses Format ist etwas älter, funktioniert aber genauso wie die Base63-Codierung.
quelle
Wenn Sie die Kontrolle über das XML-Format haben, sollten Sie das Problem auf den Kopf stellen. Anstatt das binäre XML anzuhängen, sollten Sie darüber nachdenken, wie Sie ein Dokument mit mehreren Teilen einschließen, von denen einer XML enthält.
Die traditionelle Lösung hierfür ist ein Archiv (z. B. Teer). Aber wenn Sie Ihre einschließende Dokument in einem textbasierten Format behalten möchten oder wenn Sie Zugriff auf eine Datei nicht Bibliothek Archivierung haben, gibt es auch ein standardisiertes Schema , das stark in E - Mail verwendet wird und HTTP , die ist multipart / * MIME mit Content-Transfer-Encoding: binär .
Wenn Ihre Server beispielsweise über HTTP kommunizieren und Sie ein mehrteiliges Dokument senden möchten, wobei das primäre ein XML-Dokument ist, das sich auf Binärdaten bezieht, sieht die HTTP-Kommunikation möglicherweise folgendermaßen aus:
Wie im obigen Beispiel verweist das XML unter Verwendung eines
cid
URI-Schemas, das eine Kennung für den Content-ID-Header ist, auf die Binärdaten im umschließenden Multipart . Der Overhead dieses Schemas wäre nur der MIME-Header. Ein ähnliches Schema kann auch für die HTTP-Antwort verwendet werden. Natürlich haben Sie im HTTP-Protokoll auch die Möglichkeit, ein mehrteiliges Dokument in einer separaten Anfrage / Antwort zu senden.Wenn Sie vermeiden möchten, dass Ihre Daten mehrteilig verpackt werden, verwenden Sie den Daten-URI:
Dies hat jedoch den Base64-Overhead.
quelle