Domanda

Ho due applicazioni scritte in Java che comunicano tra loro utilizzando messaggi XML in rete.Sto utilizzando un parser SAX all'estremità ricevente per recuperare i dati dai messaggi.Uno dei requisiti è incorporare dati binari in un messaggio XML, ma a SAX questo non piace.Qualcuno sa come fare questo?

AGGIORNAMENTO:Ho funzionato con il Base64 classe da libreria di codec apache commons, nel caso in cui qualcun altro stia provando qualcosa di simile.

È stato utile?

Soluzione

Potresti codificare i dati binari usando base64 e inserirli in un elemento Base64;l'articolo seguente è piuttosto valido sull'argomento.

Gestione dei dati binari nei documenti XML

Altri suggerimenti

XML è così versatile...

<DATA>
  <BINARY>
    <BIT index="0">0</BIT>
    <BIT index="1">0</BIT>
    <BIT index="2">1</BIT>
    ...
    <BIT index="n">1</BIT>
  </BINARY>
</DATA>

XML è come la violenza: se non risolve il tuo problema, non ne stai utilizzando abbastanza.

MODIFICARE:

A proposito:Base64 + CDATA è probabilmente la soluzione migliore

(MODIFICA2:
Chiunque mi abbia aggiornato, per favore aggiorna anche la vera risposta.Non vogliamo che qualche povera anima venga qui e implementi effettivamente il mio metodo perché era il più alto in classifica su SO, giusto?)

Base64 è davvero la risposta giusta ma CDATA no, in pratica significa:"questo potrebbe essere qualsiasi cosa", tuttavia deve essere non essere qualsiasi cosa, deve essere dati binari codificati Base64.Lo schema XML definisce Binario Base 64 come tipo di dati primitivo che puoi usare nel tuo xsd.

Ho avuto questo problema proprio la settimana scorsa.Ho dovuto serializzare un file PDF e inviarlo, all'interno di un file XML, a un server.

Se utilizzi .NET, puoi convertire un file binario direttamente in una stringa base64 e inserirlo all'interno di un elemento XML.

string base64 = Convert.ToBase64String(File.ReadAllBytes(fileName));

Oppure esiste un metodo integrato direttamente nell'oggetto XmlWriter.Nel mio caso particolare, ho dovuto includere lo spazio dei nomi del tipo di dati di Microsoft:

StringBuilder sb = new StringBuilder();
System.Xml.XmlWriter xw = XmlWriter.Create(sb);
xw.WriteStartElement("doc");
xw.WriteStartElement("serialized_binary");
xw.WriteAttributeString("types", "dt", "urn:schemas-microsoft-com:datatypes", "bin.base64");
byte[] b = File.ReadAllBytes(fileName);
xw.WriteBase64(b, 0, b.Length);
xw.WriteEndElement();
xw.WriteEndElement();
string abc = sb.ToString();

La stringa abc ha un aspetto simile a questo:

<?xml version="1.0" encoding="utf-16"?>
<doc>
    <serialized_binary types:dt="bin.base64" xmlns:types="urn:schemas-microsoft-com:datatypes">
        JVBERi0xLjMKJaqrrK0KNCAwIG9iago8PCAvVHlwZSAvSW5mbw...(plus lots more)
    </serialized_binary>
</doc>

Di solito codifico i dati binari con MIMEBase64 O Codifica dell'URL.

Prova a codificare/decodificare Base64 i tuoi dati binari.Guarda anche le sezioni CDATA

Forse codificarli in un set noto: qualcosa come la base 64 è una scelta popolare.

Qualunque codifica da binario a testo farà il trucco.Io uso qualcosa del genere

<data encoding="yEnc>
<![CDATA[ encoded binary data ]]>
</data>

Sebbene le altre risposte siano per lo più soddisfacenti, potresti provare un altro metodo di codifica più efficiente in termini di spazio come yEnc.(yEnc collegamento a Wikipedia) Con yEnc ottieni anche la funzionalità di checksum immediatamente "pronta all'uso".Leggi e link qui sotto.Naturalmente, poiché XML non ha un tipo yEnc nativo, lo schema XML dovrebbe essere aggiornato per descrivere correttamente il nodo codificato.

Perché:A causa delle strategie di codifica base64/63, uuencode et al.Le codifiche aumentano la quantità di dati (overhead) da archiviare e trasferire di circa il 40% (rispetto ayEnc è 1-2%).A seconda di cosa stai codificando, il 40% di sovraccarico potrebbe essere/diventare un problema.


yEnc - Estratto di Wikipedia: https://en.wikipedia.org/wiki/YEncyEnc è uno schema di codifica da binario a testo per il trasferimento di file binari nei messaggi su Usenet o via e-mail....Un ulteriore vantaggio di yEnc rispetto ai metodi di codifica precedenti, come uuencode e Base64, è l'inclusione di un checksum CRC per verificare che il file decodificato sia stato consegnato intatto.‎

Il sovraccarico di Base64 è del 33%.

BaseXML per XML1.0 le spese generali sono solo del 20%.Ma non è uno standard e ha ancora solo un'implementazione C.Dai un'occhiata se sei preoccupato per la dimensione dei dati.Tieni presente che tuttavia i browser tendono a implementare la compressione in modo che sia meno necessaria.

L'ho sviluppato dopo la discussione in questo thread: Codifica dei dati binari in XML:alternative a base64.

Puoi anche Codice Uue i tuoi dati binari originali.Questo formato è un po' più vecchio ma fa la stessa cosa della codifica base63.

Se hai il controllo sul formato XML, dovresti ribaltare il problema.Piuttosto che allegare l'XML binario dovresti pensare a come allegare un documento che ha più parti, una delle quali contiene XML.

La soluzione tradizionale a questo è un archivio (ad es.catrame).Ma se desideri conservare il documento allegato in un formato basato su testo o se non hai accesso a una libreria di archiviazione file, esiste anche uno schema standardizzato ampiamente utilizzato nelle e-mail e HTTP che è multipart/* MIME con Codifica del trasferimento dei contenuti:binario.

Ad esempio, se i tuoi server comunicano tramite HTTP e desideri inviare un documento in più parti, il principale è un documento XML che fa riferimento a dati binari, la comunicazione HTTP potrebbe assomigliare a questa:

POST / HTTP/1.1
Content-Type: multipart/related; boundary="qd43hdi34udh34id344"
... other headers elided ...

--qd43hdi34udh34id344
Content-Type: application/xml

<myxml>
    <data href="cid:data.bin"/>
</myxml>
--qd43hdi34udh34id344
Content-Id: <data.bin>
Content-type: application/octet-stream
Content-Transfer-Encoding: binary

... binary data ...
--qd43hdi34udh34id344--

Come nell'esempio precedente, l'XML fa riferimento ai dati binari nella multiparte allegata utilizzando a cid Schema URI che è un identificatore per l'intestazione Content-Id.Il sovraccarico di questo schema sarebbe solo l'intestazione MIME.Uno schema simile può essere utilizzato anche per la risposta HTTP.Naturalmente nel protocollo HTTP hai anche la possibilità di inviare un documento multiparte in una richiesta/risposta separata.

Se vuoi evitare di racchiudere i tuoi dati in una multiparte devi utilizzare l'URI dei dati:

<myxml>
    <data href="data:application/something;charset=utf-8;base64,dGVzdGRhdGE="/>
</myxml>

Ma questo ha il sovraccarico di base64.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top