Как создать XmlDocument с помощью XmlWriter в .NET?
Многие функции .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?
Ответы
Ответ 1
Здесь по крайней мере одно решение:
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()
Кредиты отправляются в Martin Honnen: http://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli=1
Ответ 2
Вы можете сделать обратное: сначала создайте XmlDocument
, используя DOM, затем напишите его в XmlWriter
:
XmlDocument xdoc = new XmlDocument();
... // build the document
StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
xdoc.WriteTo(xw);
Ответ 3
Вы можете написать 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
Идея XmlWriter заключается в том, чтобы дождаться, когда вы закончите изменять свои данные до начала написания.
XmlWriter не был создан с учетом вашей ситуации.
Либо
- Подождите, пока вы не узнаете, что ваши данные
перед тем, как писать
или
- Сделайте то, что вы сейчас делаете
Ответ 5
Существует базовый объект Stream, который писал XmlWriter, если он был двунаправленным (MemoryStream), вы можете просто переставить его обратно на -0-, а затем использовать объект Stream в XmlDocument.Load(потоке).
НТН,
Z