Как преобразовать XmlDocument в массив‹byte›?

Я создал XmlDocument и теперь хочу преобразовать его в массив. Как это может быть сделано?

Спасибо,


person Newbie    schedule 30.09.2009    source источник


Ответы (3)


Попробуйте следующее:

using System.Text;
using System.Xml;

XmlDocument dom = GetDocument()
byte[] bytes = Encoding.Default.GetBytes(dom.OuterXml);

Если вы хотите сохранить текстовую кодировку документа, измените кодировку Default на нужную кодировку или выполните предложение Джона Скита.

person Steve Guidi    schedule 30.09.2009
comment
Это решение, которое я использовал до сих пор. Проблема в том, что это вызывает исключение OutOfMemoryException для больших XML-документов. :/ - person sunside; 14.05.2010
comment
Другое различие между dom.OuterXml и dom.Save заключается в том, что OuterXml содержит XML-данные в одной длинной строке без форматирования. Метод Сохранить создает форматированный XML-документ с отступом. - person tibx; 24.10.2017

Запишите его в MemoryStream, а затем вызовите ToArray в потоке:

using System;
using System.IO;
using System.Text;
using System.Xml;

class Test
{
    static void Main(string[] args)
    {
        XmlDocument doc = new XmlDocument();
        XmlElement root = doc.CreateElement("root");
        XmlElement element = doc.CreateElement("child");
        root.AppendChild(element);
        doc.AppendChild(root);

        MemoryStream ms = new MemoryStream();
        doc.Save(ms);
        byte[] bytes = ms.ToArray();
        Console.WriteLine(Encoding.UTF8.GetString(bytes));
    }
}

Для большего контроля над форматированием вы можете создать XmlWriter из потока и использовать XmlDocument.WriteTo(writer).

person Jon Skeet    schedule 30.09.2009
comment
если вы собираетесь передавать MemoryStream в качестве входных данных для чего-то еще, не забудьте установить позицию обратно на ноль. документ.Сохранить(мс); мс.Позиция = 0; - person jhilden; 19.01.2013
comment
Я понимаю, что размер в байтах зависит от кодировки, но мне интересно, насколько это эффективно. (Я спрашиваю, потому что моему приложению нужно делать это очень часто (не менее 10 раз в секунду). Имеет ли смысл задавать MemoryStream начальный размер? И, имея это в виду, есть ли способ получить представление об ожидаемом размер из XmlDocument? - person codesniffer; 07.11.2018
comment
@codesniffer: Вы можете делать очень много работы 10 раз в секунду. Если документ не особенно большой, я бы не парился. Что касается того, следует ли вам указать MemoryStream начальный размер: у вас есть больше возможностей для сравнения с вашими данными, чем у меня. Если вы заботитесь о производительности, вы должны тщательно ее измерять. Это позволяет вам экспериментировать с изменениями. - person Jon Skeet; 07.11.2018
comment
@JonSkeet Спасибо, Джон. К сожалению, размеры данных исходят от вызывающей стороны моей библиотеки и могут быть по всей карте - от КБ до МБ и, возможно, больше (явного ограничения нет). Есть ли способ получить представление об ожидаемом размере из XmlDocument? - person codesniffer; 07.11.2018
comment
@codesniffer: Если вас интересует только размер, а не данные, вы можете написать свою собственную реализацию Stream, которая отбрасывает все переданные данные, но ведет их подсчет. Есть ли у вас конкретная причина для беспокойства по этому поводу, например. сообщения об ошибках от пользователей? Или вы пытаетесь думать о потенциальных проблемах до того, как они действительно превратятся в проблемы? - person Jon Skeet; 07.11.2018
comment
@JonSkeet Да, упреждающий. Спасибо за предложение, я буду иметь его в виду, если мне нужно будет двигаться в этом направлении. Профилирование производительности на следующей неделе. - person codesniffer; 07.11.2018

Стив Гуиди: Спасибо! Ваш код был прямо на деньгах! Вот как я решил проблему со специальными символами:

    public static byte[] ConvertToBytes(XmlDocument doc)
    {
        Encoding encoding = Encoding.UTF8;
        byte[] docAsBytes = encoding.GetBytes(doc.OuterXml);
        return docAsBytes;
    } 
person Daniel    schedule 13.11.2010