如何在.NET中使用XmlWriter创建XmlDocument?

Boa*_*oaz 47 .net xmldocument xmlwriter

许多.NET函数使用XmlWriter输出/生成xml.输出到文件/字符串/内存是一个非常的操作:

XmlWriter xw = XmlWriter.Create(PutYourStreamFileWriterEtcHere);
xw.WriteStartElement("root");
...
Run Code Online (Sandbox Code Playgroud)

有时,您需要操作生成的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());
Run Code Online (Sandbox Code Playgroud)

但是这效率很低 - 首先将所有xml信息序列化为字符串,然后再次解析字符串以创建DOM.

如何指出XmlWriter直接构建XmlDocument?

Boa*_*oaz 82

这是至少一个解决方案:

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.
}
Run Code Online (Sandbox Code Playgroud)

显然,当你调用AppendChild()时,XpathNavigator会给你一个XmlWriter

积分转到Martin Honnen:http://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli = 1

  • 另请注意,如上所述,生成的`XmlWriter`将具有"Document"的一致性级别,因此如果您将其作为输入发送到XSL转换作为输入(并且您没有创建完整的文档),那么可以使用`new XmlDocument().CreateFragment().CreateNavigator()`代替. (3认同)
  • 请注意,这样做的一个缺点是 WriteRaw 对于基于 XPathNavigator 的 XmlWriter 的行为有所不同,即它会转义输出。 (2认同)

Tho*_*que 9

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

XmlDocument xdoc = new XmlDocument();
... // build the document

StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
xdoc.WriteTo(xw);
Run Code Online (Sandbox Code Playgroud)

  • XmlWriter不是为写入XmlDocument而设计的,它旨在写入Stream或TextWriter.你问的是根本不可能的,我只是建议另一种方法...... (4认同)
  • +1来反击无意义的downvote.恕我直言,这是对问题的正确答案 (2认同)
  • @Tomas Levesque:我的观点是有人问一个问题"如何解决X",答案是"不要解决X,而是解决Y",这不是问题.如果不可能做到,那就是答案. (2认同)
  • @Seb:我非常不同意.如果我们每次需要从A到C停止并且没有直接根,我们就不会像程序员那样远.我们的专业取决于能否通过B找到替代路线.托马斯建议采用另一种方法,老实说,我不明白这个答案的诽谤(是的,我知道这是一个社区.是的,我已经行使了投票权)在这个答案.但我可以表达我对一般回答的不满 (2认同)

Jay*_*hia 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());
Run Code Online (Sandbox Code Playgroud)