ejemplo - ¿Cómo crear un XmlDocument usando XmlWriter en.NET?
write xml c# (5)
Aquí hay al menos una solución:
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.
}
Aparentemente XpathNavigator te da un XmlWriter cuando llamas a AppendChild ()
Los créditos van a Martin Honnen en: http://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli=1
Muchas funciones .NET usan XmlWriter para generar / generar xml. La salida a un archivo / cadena / memoria es una operación muy:
XmlWriter xw = XmlWriter.Create(PutYourStreamFileWriterEtcHere);
xw.WriteStartElement("root");
...
A veces, necesita manipular el Xml resultante y, por lo tanto, desea cargarlo en un XmlDocument o puede necesitar un XmlDocument por algún otro motivo, pero debe generar el XML utilizando un XmlWriter. Por ejemplo, si llama a una función en una biblioteca de terceros que solo imprime en un XmlWriter.
Una de las cosas que puede hacer es escribir el xml en una cadena y luego cargarlo en su XmlDocument:
StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
/* write away */
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(S.ToString());
Sin embargo, esto es ineficiente: primero se serializa toda la información xml en una cadena, luego se analiza la cadena de nuevo para crear el DOM.
¿Cómo se puede apuntar un XmlWriter para construir un XmlDocument directamente?
Hay un objeto Stream subyacente en el que el XmlWriter estaba escribiendo, si fuera bidireccional (MemoryStream), simplemente podría volver a colocarlo en -0- y luego usar el objeto Stream en XmlDocument.Load (stream).
HTH,
Z
La idea detrás de XmlWriter es esperar hasta que haya terminado de modificar sus datos antes de comenzar a escribir.
XmlWriter no fue construido teniendo en cuenta su situación.
Ya sea
- Espere hasta saber cuáles serán sus datos antes de escribir
o
- Haz lo que estás haciendo actualmente
Podrías hacer lo contrario: construir el XmlDocument
primero usando DOM, luego escribirlo en un XmlWriter
:
XmlDocument xdoc = new XmlDocument();
... // build the document
StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
xdoc.WriteTo(xw);
Puede escribir un archivo xml usando la clase XMLWriter. Aquí hay un ejemplo para esto.
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());