Pregunta

Tengo dos aplicaciones escritas en Java que se comunican entre sí mediante mensajes XML a través de la red.Estoy usando un analizador SAX en el extremo receptor de obtener los datos de nuevo de los mensajes.Uno de los requisitos es la de insertar datos binarios en un mensaje XML, pero el SAXO no le gusta esto.¿Alguien sabe cómo hacer esto?

ACTUALIZACIÓN:Tengo este trabajo con el Base64 la clase de la apache commons biblioteca de códec, en caso de que alguien más está tratando de hacer algo parecido.

¿Fue útil?

Solución

Usted podría codificar los datos binarios usando base64 y se pone en Base64 elemento;el siguiente es un artículo bastante bueno sobre el tema.

El manejo de Datos Binarios en Documentos XML

Otros consejos

XML es tan versátil...

<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 es como la violencia - Si no resuelve su problema, usted no está usando bastante.

EDITAR:

BTW:Base64 + CDATA es probablemente la mejor solución

(EDIT2:
Quien upmods mí, por favor, también upmod la respuesta real.No queremos que ningún pobre alma para venir aquí y poner en práctica mi método, porque era el lugar más alto en ASÍ, ¿verdad?)

Base64 es de hecho el derecho de responder, pero CDATA no es, eso es, básicamente, diciendo:"esto podría ser cualquier cosa", sin embargo se debe no ser cualquier cosa, tiene que ser codificado en Base64 datos binarios.Esquema XML define En Base 64 binario como un tipo de datos primitivo que usted puede utilizar en su xsd.

He tenido este problema la semana pasada.Yo había serializar un archivo PDF y enviarlo, dentro de un archivo XML a un servidor.

Si usted está usando .NET, usted puede convertir un archivo binario directamente a una cadena base64 y pegarlo dentro de un elemento XML.

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

O, hay un método integrado directamente en el objeto de XmlWriter.En mi caso particular, tuve que incluyen Microsoft del tipo de datos de espacio de nombres:

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 cadena abc parece a algo que se parece a esto:

<?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>

Me suelen codificar los datos binarios con MIME Base64 o La codificación URL.

Trate de Base64 de codificación/decodificación de los datos binarios.También mirar en las secciones CDATA

Tal vez codificar en un conocido conjunto, algo así como la base 64 es una elección popular.

Cualquier binario a la codificación de texto hará el truco.Yo uso algo como que

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

Mientras que las otras respuestas son en su mayoría bien, usted podría tratar de otro, más eficiente con el espacio, el método de codificación como yEnc.(yEnc enlace de wikipedia) Con yEnc también se obtiene de la suma de comprobación de la capacidad de derecho "fuera de la caja".Leer y enlaces de abajo.Por supuesto, debido a que XML no tiene un nativo yEnc escriba su esquema XML debe ser actualizado para describir adecuadamente el codificado nodo.

Por qué:Debido a las estrategias de codificación base64/63, uuencode et al.las codificaciones de aumentar la cantidad de datos (sobrecarga) que usted necesita para almacenar y transferir aproximadamente un 40% (vsyEnc del 1-2%).Dependiendo de lo que estés codificación, el 40% de sobrecarga podría ser/convertirse en un problema.


yEnc - Wikipedia: https://en.wikipedia.org/wiki/YEnc yEnc es un binario-a-esquema de codificación de texto para la transferencia de archivos binarios en los mensajes en Usenet o a través de e-mail....Una ventaja adicional de yEnc de los anteriores métodos de codificación, tales como uuencode y Base64, es la inclusión de una suma de comprobación CRC para comprobar que el archivo decodificado ha sido entregado intacto.

Base64 sobrecarga es de 33%.

BaseXML para XML1.0 la sobrecarga es de sólo 20%.Pero no es una norma y sólo tienen una implementación en C todavía.Échale un vistazo si te preocupa el tamaño de los datos.Tenga en cuenta que sin embargo los navegadores tiende a aplicar la compresión por lo que es menos necesario.

Yo se desarrolló después de la discusión en este hilo: La codificación binaria de datos en XML :alternativas a base64.

También puede Uuencode original de datos binarios.Este formato es un poco mayor pero no es lo mismo que base63 de codificación.

Si usted tiene el control sobre el formato XML, debe convertir el problema de adentro hacia afuera.En lugar de adjuntar el XML binario, usted debe pensar acerca de cómo adjuntar un documento que tiene varias partes, una de las cuales contiene XML.

La solución tradicional a este es un archivo (por ejemplo,el alquitrán).Pero si usted quiere mantener su adjuntando el documento en un formato basado en texto o si usted no tiene acceso a un archivo de archivado de la biblioteca, también hay un esquema estandarizado que se utiliza mucho en el correo electrónico y HTTP que es multipart/* MIME con Content-Transfer-Encoding:binario.

Por ejemplo, si sus servidores se comunican a través de HTTP y desea enviar un documento multiparte, el principal de ser un documento XML que se refiere a un binario de datos, la comunicación HTTP podría ser algo como esto:

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--

Como en el ejemplo anterior, el XML se refieren a los datos binarios de la envolvente de varias partes mediante el uso de un cid Esquema de URI, que es un identificador para el Identificador de Contenido de encabezado.La sobrecarga de este esquema sería el encabezado MIME.Un esquema similar también puede ser utilizado para la respuesta HTTP.Por supuesto, en el protocolo HTTP, usted también tiene la opción de enviar un documento en varias partes separadas de solicitud/respuesta.

Si usted quiere evitar envolver sus datos en un multipart es el uso de datos URI:

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

Pero esto tiene el base64 sobrecarga.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top