Вставка изображений в файл XML

Я хотел бы вставить изображения внутри элемента в XML файл, что лучший способ сделать это? Не могли бы вы предложить хороший способ включения изображений в xml файл?

Ответы

Ответ 1

Самый распространенный способ сделать это - включить двоичный код как base-64 в элемент. Однако это обходное решение и добавляет немного объема в файл.

Например, это байты от 00 до 09 (обратите внимание, что нам понадобилось 16 байтов для кодирования данных размером 10 байт):

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

как вы делаете эту кодировку, зависит от каждой архитектуры. Например, с .NET вы можете использовать Convert.ToBase64String или XmlWriter.WriteBase64.

Ответ 2

XML не является форматом для хранения изображений, а не двоичных данных. Я думаю, все зависит от того, как вы хотите использовать эти изображения. Если вы находитесь в веб-приложении и хотите прочитать их оттуда и отобразить их, я бы сохранил URL-адреса. Если вам нужно отправить их на другую конечную точку, я бы сериализовал их, а не сохранял вручную в XML. Пожалуйста, объясните, что такое сценарий.

Ответ 3

Так как XML - это текстовый формат, и изображения обычно не являются (кроме некоторых древних и архаичных форматов), нет действительно разумного способа сделать это. Поиск таких вещей, как ODT или OOXML, также показывает, что они не вставляют изображения непосредственно в XML.

Однако вы можете преобразовать его в Base64 или аналогично и вставить его в XML.

Обработка пробелов XML может еще больше усложнить ситуацию в таких случаях.

Ответ 4

Я всегда конвертирую данные байта в кодировку Base64, а затем вставляю изображение.

Это также способ, которым это делает Word, поскольку это файлы XML (не то, что Word является хорошим примером того, как работать с XML: P).

Ответ 5

Вот некоторый код, взятый из Kirk Evans Blog, который демонстрирует, как кодировать изображение на С#;

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

//Create an in-memory stream to hold the picture 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();