如何在.NET中使用XmlWriter创build一个XmlDocument?

许多.NET函数使用XmlWriter输出/生成XML。 输出到一个文件/string/内存是一个非常操作:

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

有时,您需要操作生成的Xml,因此希望将其加载到XmlDocument中,或者由于其他原因可能需要XmlDocument,但是必须使用XmlWriter生成XML。 例如,如果您在仅输出到XmlWriter的第三方库中调用函数。

你可以做的事情之一是写入XML到一个string,然后将其加载到您的XmlDocument:

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

但是这样做效率不高 – 首先将所有的xml信息序列化为一个string,然后再次parsingstring来创buildDOM。

你怎么能指望一个XmlWriter直接build立一个XmlDocument?

这里至less有一个解决scheme:

 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

你可以做相反的事情:首先使用DOM构buildXmlDocument ,然后将其写入一个XmlWriter

 XmlDocument xdoc = new XmlDocument(); ... // build the document StringWriter S = new StringWriter(); XmlWriter xw = XmlWriter.Create(S); xdoc.WriteTo(xw); 

您可以使用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()); 

XmlWriter背后的想法是等到修改完数据之后再开始写作。

XmlWriter没有考虑到你的情况。

  • 等到你知道你的数据将在写入之前

要么

  • 做你现在正在做的事情

如果是双向的(MemoryStream),就有一个XmlWriter写入的底层Stream对象,您可以简单地将其重新定位到-O-,然后使用XmlDocument.Load(stream)中的Stream对象。

HTH,

ž