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 para recuperar los datos de los mensajes. Uno de los requisitos es incrustar datos binarios en un mensaje XML, pero a SAX no le gusta esto. ¿Alguien sabe como hacer esto?
ACTUALIZACIÓN: Conseguí que esto funcionara con la clase Base64 de la biblioteca de códec de apache commons , en caso de que alguien más esté intentando algo similar.
fuente
Base 64 es de hecho la respuesta correcta, pero no es CDATA, que está básicamente diciendo: "esto podría ser cualquier cosa", sin embargo, debe no ser sólo algo, tiene que ser codificado base 64 de datos binarios. El esquema XML define el binario Base 64 como un tipo de datos primitivo que puede usar en su xsd.
fuente
xs:base64Binary
tipo de datos, que es el tipo correcto para usar.Tuve este problema la semana pasada. Tuve que serializar un archivo PDF y enviarlo, dentro de un archivo XML, a un servidor.
Si está utilizando .NET, puede convertir un archivo binario directamente en una cadena base64 y pegarlo dentro de un elemento XML.
O hay un método integrado directamente en el objeto XmlWriter. En mi caso particular, tuve que incluir el espacio de nombres del tipo de datos de Microsoft:
La cadena abc se ve así:
fuente
Normalmente codifico los datos binarios con codificación MIME Base64 o URL .
fuente
Pruebe la codificación / decodificación Base64 de sus datos binarios. También busque en las secciones de CDATA
fuente
Tal vez codificarlos en un conjunto conocido; algo como base 64 es una opción popular.
fuente
Cualquier codificación de binario a texto funcionará . Yo uso algo como eso
fuente
La sobrecarga de Base64 es del 33%.
La sobrecarga de BaseXML para XML1.0 es solo del 20% . Pero no es un estándar y solo tiene una implementación en C. Compruébelo si le preocupa el tamaño de los datos. Tenga en cuenta que, sin embargo, los navegadores tienden a implementar la compresión para que sea menos necesaria.
Lo desarrollé después de la discusión en este hilo: Codificación de datos binarios dentro de XML: alternativas a base64 .
fuente
Si bien las otras respuestas están en su mayoría bien, puede probar otro método de codificación más eficiente en el espacio como yEnc. ( Enlace de wikipedia de yEnc ) Con yEnc también obtenga la capacidad de suma de comprobación "lista para usar". Lea y enlaces a continuación. Por supuesto, debido a que XML no tiene un tipo yEnc nativo, su esquema XML debe actualizarse para describir correctamente el nodo codificado.
Por qué : Debido a las estrategias de codificación base64 / 63, uuencode et al. Las codificaciones aumentan la cantidad de datos (gastos generales) que necesita almacenar y transferir en aproximadamente un 40% (frente al 1-2% de yEnc). Dependiendo de lo que esté codificando, la sobrecarga del 40% podría convertirse en un problema.
yEnc - Resumen de Wikipedia: https://en.wikipedia.org/wiki/YEnc yEnc es un esquema de codificación de binario a texto para transferir archivos binarios en mensajes en Usenet o por correo electrónico. ... Una ventaja adicional de yEnc sobre los métodos de codificación anteriores, como uuencode y Base64, es la inclusión de una suma de comprobación CRC para verificar que el archivo decodificado se haya entregado intacto.
fuente
También puede Uuencode sus datos binarios originales. Este formato es un poco más antiguo, pero hace lo mismo que la codificación base63.
fuente
Si tiene control sobre el formato XML, debería darle la vuelta al problema. En lugar de adjuntar el XML binario, debería pensar en cómo adjuntar un documento que tiene varias partes, una de las cuales contiene XML.
La solución tradicional a esto es un archivo (por ejemplo, tar). Pero si desea mantener el documento adjunto en un formato basado en texto o si no tiene acceso a una biblioteca de archivo de archivos, también existe un esquema estandarizado que se usa mucho en correo electrónico y HTTP que es multiparte / * MIME con Codificación de transferencia de contenido: binario .
Por ejemplo, si sus servidores se comunican a través de HTTP y desea enviar un documento de varias partes, siendo el principal un documento XML que se refiere a datos binarios, la comunicación HTTP podría verse así:
Como en el ejemplo anterior, el XML se refiere a los datos binarios en la multiparte adjunta mediante un
cid
esquema de URI que es un identificador del encabezado Content-Id. La sobrecarga de este esquema sería solo el encabezado MIME. También se puede utilizar un esquema similar para la respuesta HTTP. Por supuesto, en el protocolo HTTP, también tiene la opción de enviar un documento de varias partes en una solicitud / respuesta separada.Si desea evitar envolver sus datos en una multiparte es usar URI de datos:
Pero esto tiene la sobrecarga de base64.
fuente