Jak utworzyć XmlDocument za pomocą XmlWriter in.NET?

Wiele funkcji. NET używa XmlWriter do wyprowadzania / generowania xml. Wyjście do pliku / string / memory jest bardzo operacją:

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

Czasami musisz manipulować wynikowym Xml i dlatego chcesz załadować go do XmlDocument lub możesz potrzebować XmlDocument z innego powodu, ale musisz wygenerować XML za pomocą XmlWriter. Na przykład, jeśli wywołasz funkcję w bibliotece innej firmy, która jest wysyłana tylko do XmlWriter.

Jedną z rzeczy, które możesz zrobić, to napisać xml do ciągu znaków, a następnie załadować go do XmlDocument:

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

Jest to jednak nieefektywne - najpierw serializujesz wszystkie informacje xml w łańcuch znaków, a następnie ponownie analizujesz łańcuch znaków, aby utworzyć DOM.

Jak można skierować Xmlwritera do zbudowania bezpośrednio XmlDocument?

Author: Boaz, 2009-08-28

5 answers

Oto co najmniej jedno rozwiązanie:

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.
}

Najwyraźniej XPathNavigator daje Ci XmlWriter po wywołaniu AppendChild ()

Napisy idą do Martina Honnena na: http://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli=1{[7]

 78
Author: Boaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-28 14:28:31

Możesz zrobić odwrotnie: zbuduj XmlDocument Najpierw używając DOM, a następnie napisz do XmlWriter:

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

StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
xdoc.WriteTo(xw);
 9
Author: Thomas Levesque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-28 13:41:52

Możesz zapisać plik xml używając klasy XMLWriter. Oto przykład na to.

    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());
 7
Author: Jayesh Sorathia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-27 11:44:30

Ideą XmlWriter jest poczekać, aż skończysz modyfikować swoje dane przed rozpoczęciem pisania.

XmlWriter nie został zbudowany z myślą o twojej sytuacji.

Albo

  • Poczekaj, aż dowiesz się, jakie są Twoje dane będzie przed napisaniem

LUB

  • rób to, co aktualnie robisz
 4
Author: Binary Worrier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-28 13:45:50

Istnieje podstawowy obiekt Stream, do którego zapisywał XmlWriter, jeśli był dwukierunkowy (MemoryStream), można go po prostu ustawić z powrotem na-0 -, a następnie użyć obiektu Stream w dokumencie XmlDocument.Obciążenie (strumień).

HTH,

Z

 1
Author: Zach Bonham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-28 13:46:42