Как создать XmlDocument с помощью XmlWriter in.NET?
многие функции .NET используют XmlWriter для вывода / генерации xml. Вывод в файл / строку / память-это очень операция:
XmlWriter xw = XmlWriter.Create(PutYourStreamFileWriterEtcHere);
xw.WriteStartElement("root");
...
иногда вам нужно манипулировать результирующим Xml и поэтому вы хотите загрузить его в XmlDocument или может потребоваться XmlDocument по какой-либо другой причине, но вы должны создать XML с помощью XmlWriter. Например, если вы вызываете функцию в сторонней библиотеке, которая выводит только XmlWriter.
одна из вещей, которые вы можете do-это записать 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 ответов
здесь по крайней мере одно решение:
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
вы могли бы сделать наоборот: построить XmlDocument
сначала используя DOM, затем напишите его в XmlWriter
:
XmlDocument xdoc = new XmlDocument();
... // build the document
StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
xdoc.WriteTo(xw);
вы можете написать 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());
идея XmlWriter заключается в том, чтобы подождать, пока вы не закончите изменять свои данные, прежде чем начать писать.
XmlWriter не был построен с учетом вашей ситуации.
или
- подождите, пока вы не узнаете, что ваши данные будет перед написанием
или
- делать то, что вы сейчас делаете
существует базовый объект Stream, в который XmlWriter писал, если он был двунаправленным (MemoryStream), вы можете просто переместить его обратно в-0-и затем использовать объект Stream в XmlDocument.Загрузка (поток).
HTH,
Z