Domanda

Molte funzioni .NET utilizzano XmlWriter di uscita / generare codice XML. Inviare a un file / string / memoria è una funzione:

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

A volte, è necessario manipolare il Xml risultante e desidera pertanto caricarla in un XmlDocument o potrebbe essere necessario un XmlDocument per qualche altro motivo, ma è necessario generare il codice XML utilizzando un XmlWriter. Ad esempio, se si chiama una funzione in una libreria di 3a parte che emette ad un XmlWriter solo.

Una delle cose che puoi fare è scrivere il codice XML in una stringa e poi caricarlo nel vostro XmlDocument:

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

Tuttavia questo è inefficiente - prima si serializzare tutte le informazioni XML in una stringa, poi si analizza di nuovo la stringa per creare il DOM

.

Come si può puntare un XmlWriter per costruire un XmlDocument direttamente?

È stato utile?

Soluzione

Ecco almeno una soluzione:

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

A quanto pare XpathNavigator ti dà un XmlWriter quando si chiama AppendChild ()

Credits andare a Martin Honnen su: http://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli=1

Altri suggerimenti

Si potrebbe fare il contrario: costruire la prima XmlDocument usando DOM, quindi scrivere in un XmlWriter:

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

StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
xdoc.WriteTo(xw);

È possibile scrivere file XML utilizzando la classe XMLWriter. Ecco esempio di questo.

    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());

L'idea alla base XmlWriter è quella di aspettare fino a quando hai finito di modificare i dati prima di iniziare a scrivere.

XmlWriter non è stata costruita con la vostra situazione in mente.

In entrambi i

  • Aspetta di sapere che cosa i vostri dati sono sta per essere prima di scrivere

o

  • fare quello che stai facendo attualmente

C'è un oggetto Stream sottostante che il XmlWriter scriveva a, se fosse bidirezionale (MemoryStream), si potrebbe semplicemente riposizionare di nuovo a -0- e quindi utilizzare l'oggetto Stream nel XmlDocument.Load (stream) .

HTH,

Z

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top