2009-04-14 15 views

Respuesta

19

La forma más común de hacerlo es incluir el binario como base-64 en un elemento. Sin embargo, esto es una solución y agrega un poco de volumen al archivo.

Por ejemplo, este es el bytes 00 a 09 (en cuenta que necesitábamos 16 bytes para codificar un valor de 10 bytes de datos):

<xml><image>AAECAwQFBgcICQ==</image></xml> 

cómo lo hace la codificación varía según la arquitectura. Por ejemplo, con .NET puede usar Convert.ToBase64String o XmlWriter.WriteBase64.

4

Dado que XML es un formato de texto y las imágenes generalmente no lo son (excepto en algunos formatos antiguos y arcaicos) no existe una forma realmente sensata de hacerlo. Observar cosas como ODT u OOXML también le muestra que no incrustan imágenes directamente en XML.

Lo que puede hacer, sin embargo, es convertirlo a Base64 o similar e incrustarlo en el XML.

Sin embargo, el manejo en blanco de XML puede complicar aún más las cosas en tales casos.

+0

Estoy hablando de los archivos Word XML que puede obtener cuando "Guarda como 'XML'". –

+0

Soy corregido. Sin embargo, nunca he visto a nadie usar eso (y mucho menos ver esos archivos en la naturaleza). – Joey

5

XML no es un formato para almacenar imágenes, ni datos binarios. Creo que todo depende de cómo quieras usar esas imágenes. Si está en una aplicación web y quisiera leerla desde allí y mostrarla, almacenaría las URL. Si necesita enviarlos a otro punto final web, los serializaría, en lugar de persistir manualmente en XML. Por favor explique cuál es el escenario.

4

Siempre convierto los datos de bytes en una codificación Base64 y luego inserto la imagen.

Esta es también la forma en que Word lo hace, ya que se trata de archivos XML (no es que Word sea un buen ejemplo de cómo trabajar con XML: P).

2

Aquí hay un código tomado de Kirk Evans Blog que muestra cómo codificar una imagen en C#;

//Load the picture from a file 
Image picture = Image.FromFile(@"c:\temp\test.gif"); 

//Create an in-memory stream to hold the picture's bytes 
System.IO.MemoryStream pictureAsStream = new System.IO.MemoryStream(); 
picture.Save(pictureAsStream, System.Drawing.Imaging.ImageFormat.Gif); 

//Rewind the stream back to the beginning 
pictureAsStream.Position = 0; 
//Get the stream as an array of bytes 
byte[] pictureAsBytes = pictureAsStream.ToArray(); 

//Create an XmlTextWriter to write the XML somewhere... here, I just chose 
//to stream out to the Console output stream 
System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(Console.Out); 

//Write the root element of the XML document and the base64 encoded data 
writer.WriteStartElement("w", "binData", 
         "http://schemas.microsoft.com/office/word/2003/wordml"); 

writer.WriteBase64(pictureAsBytes, 0, pictureAsBytes.Length); 

writer.WriteEndElement(); 
writer.Flush();