一尘不染

XDocument或XmlDocument

c#

我现在正在学习,XmlDocument但是我碰到了什么XDocument,当我尝试搜索它们的区别或好处时,我找不到有用的东西,您能否告诉我为什么要在另一个上使用?


阅读 244

收藏
2020-05-19

共1个答案

一尘不染

如果您使用的是.NET 3.0或更低版本, 必须使用XmlDocument经典的DOM API。同样,您会发现还有一些其他API会期望这样做。

但是,如果您有选择的话,我将彻底建议使用XDocumentLINQ to XML。这是 很多 简单的创建文档并对其进行处理。例如,两者之间的区别是:

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("root");
root.SetAttribute("name", "value");
XmlElement child = doc.CreateElement("child");
child.InnerText = "text node";
root.AppendChild(child);
doc.AppendChild(root);

XDocument doc = new XDocument(
    new XElement("root",
                 new XAttribute("name", "value"),
                 new XElement("child", "text node")));

命名空间在LINQ to XML中非常容易使用,这与我见过的任何其他XML API都不一样:

XNamespace ns = "http://somewhere.com";
XElement element = new XElement(ns + "elementName");
// etc

LINQ to XML在LINQ上也可以很好地工作-它的构造模型使您可以非常容易地用子元素序列来构造元素:

// Customers is a List<Customer>
XElement customersElement = new XElement("customers",
    customers.Select(c => new XElement("customer",
        new XAttribute("name", c.Name),
        new XAttribute("lastSeen", c.LastOrder)
        new XElement("address",
            new XAttribute("town", c.Town),
            new XAttribute("firstline", c.Address1),
            // etc
    ));

所有这些都更具声明性,与一般的LINQ风格相符。

现在,正如Brannon所提到的那样,这些是内存中的API,而不是流式API(尽管XStreamingElement支持惰性输出)。XmlReaderXmlWriter.NET中流式XML的常规方法一样,但是您可以在一定程度上混合所有API。例如,您可以流式传输大型文档,但可以使用LINQ
to XML,方法是将an
XmlReader放在元素的开头,XElement从中读取并处理它,然后继续进行下一个元素等。有关此技术的博客文章很多,这是我通过快速搜索发现的

2020-05-19