Вставка изображений в файл 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();