许多.NET函数使用XmlWriter输出/生成xml。输出到文件/字符串/内存是一个非常的操作:
XmlWriter xw = XmlWriter.Create(PutYourStreamFileWriterEtcHere);
xw.WriteStartElement("root");
...
有时,您需要操作生成的Xml,因此需要将其加载到XmlDocument中,或者由于某些其他原因可能需要XmlDocument,但您必须使用XmlWriter生成XML。例如,如果您调用第三方库中的函数,该函数仅输出到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?
答案 0 :(得分:81)
这里至少有一个解决方案:
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.
}
显然,当你调用AppendChild()时,XpathNavigator会给你一个XmlWriter
致信Martin Honnen:http://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli=1
答案 1 :(得分:8)
你可以这样做:首先使用DOM构建XmlDocument
,然后将其写入XmlWriter
:
XmlDocument xdoc = new XmlDocument();
... // build the document
StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
xdoc.WriteTo(xw);
答案 2 :(得分:7)
您可以使用XMLWriter类编写xml文件。 这是一个例子。
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());
答案 3 :(得分:4)
XmlWriter背后的想法是等到你开始编写之前完成修改数据。
XmlWriter并非基于您的情况而构建。
无论
或
答案 4 :(得分:1)
XmlWriter正在写入一个基础Stream对象,如果它是双向的(MemoryStream),你可以简单地将它重新定位回-0-然后在XmlDocument.Load(stream)中使用Stream对象
HTH,
ž