Как создать XmlDocument, используя XmlWriter в .NET? - PullRequest
47 голосов
/ 28 августа 2009

Многие функции .NET используют XmlWriter для вывода / генерации XML. Вывод в файл / строку / память - это очень операция:

XmlWriter xw = XmlWriter.Create(PutYourStreamFileWriterEtcHere);
xw.WriteStartElement("root");
...

Иногда вам нужно манипулировать получающимся Xml и, следовательно, хотеть загрузить его в XmlDocument или может понадобиться XmlDocument по какой-то другой причине, но вы должны сгенерировать XML с помощью XmlWriter. Например, если вы вызываете функцию из сторонней библиотеки, которая выводит данные только на XmlWriter.

Одна из вещей, которую вы можете сделать, - написать XML в строку, а затем загрузить ее в XmlDocument:

StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
/* write away */
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(S.ToString());

Однако это неэффективно - сначала вы сериализуете всю информацию XML в строку, а затем снова анализируете строку, чтобы создать DOM.

Как вы можете указать XmlWriter на непосредственное создание XmlDocument?

Ответы [ 5 ]

81 голосов
/ 28 августа 2009

Вот как минимум одно решение:

XmlDocument doc = new XmlDocument(); 
using (XmlWriter writer = doc.CreateNavigator().AppendChild()) 
{ 
    // Do this directly 
     writer.WriteStartDocument(); 
     writer.WriteStartElement("root"); 
     writer.WriteElementString("foo", "bar"); 
     writer.WriteEndElement(); 
     writer.WriteEndDocument();
    // or anything else you want to with writer, like calling functions etc.
}

Очевидно, XpathNavigator дает вам XmlWriter при вызове AppendChild ()

Кредиты предоставляются Мартину Хоннену по: http://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli=1

9 голосов
/ 28 августа 2009

Вы можете сделать наоборот: сначала соберите XmlDocument, используя DOM, а затем запишите его в XmlWriter:

XmlDocument xdoc = new XmlDocument();
... // build the document

StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
xdoc.WriteTo(xw);
7 голосов
/ 23 июля 2012

Вы можете написать XML-файл, используя класс XMLWriter. Вот пример для этого.

    XmlWriterSettings objSetting = new XmlWriterSettings();
    objSetting.Indent = true;
    objSetting.NewLineOnAttributes = true;

    System.Text.StringBuilder sb = new System.Text.StringBuilder();


    using (XmlWriter objWriter = XmlWriter.Create(sb, objSetting))
    {
        //Note the artificial, but useful, indenting
        objWriter.WriteStartDocument();

        objWriter.WriteStartElement("books");

        ////////Start Book Element///////

        objWriter.WriteStartElement("book");

        objWriter.WriteStartAttribute("ISBN");
        objWriter.WriteValue("asp1");
        objWriter.WriteEndAttribute();

        objWriter.WriteStartElement("Title");
        objWriter.WriteValue("ASP.NET");
        objWriter.WriteEndElement();

        objWriter.WriteElementString("ReleaseDate", "11/11/2010");

        objWriter.WriteStartElement("Pages");
        objWriter.WriteValue(200);
        objWriter.WriteEndElement(); //price

        objWriter.WriteEndElement(); //book
        ////////End Book Element///////


        ////////Another Element

        ////////Start Book Element///////

        objWriter.WriteStartElement("book");

        objWriter.WriteStartAttribute("ISBN");
        objWriter.WriteValue("c#2");
        objWriter.WriteEndAttribute();

        objWriter.WriteStartElement("Title");
        objWriter.WriteValue("C#.NET");
        objWriter.WriteEndElement();

        objWriter.WriteElementString("ReleaseDate", "10/11/2010");

        objWriter.WriteStartElement("Pages");
        objWriter.WriteValue(500);
        objWriter.WriteEndElement(); 

        objWriter.WriteEndElement(); //book
        ////////End Book Element///////



        objWriter.WriteEndElement(); //books
        objWriter.WriteEndDocument();

    }

    File.WriteAllText(Server.MapPath("BooksList.xml"), sb.ToString());
4 голосов
/ 28 августа 2009

Идея XmlWriter заключается в том, чтобы подождать, пока вы не закончили изменять свои данные, прежде чем приступить к записи.

XmlWriter не был создан с учетом вашей ситуации.

Или

  • Подождите, пока вы не узнаете, что ваши данные будет до написания

или

  • Делай то, что ты сейчас делаешь
1 голос
/ 28 августа 2009

Существует базовый объект Stream, в который XmlWriter записывал, если бы он был двунаправленным (MemoryStream), вы могли бы просто переместить его обратно в -0-, а затем использовать объект Stream в XmlDocument.Load (stream). .

НТН,

Z

...