c# - XDocument或XmlDocument




linq-to-xml (6)

XDocument来自LINQ to XML API,而XmlDocument是XML的标准DOM风格的API。 如果您熟悉DOM并且不想学习LINQ to XML,请使用XmlDocument 。 如果你是新手,可以看看这个比较两者的页面 ,并选择你喜欢哪一个更好看。

我刚开始使用LINQ to XML,并且我喜欢用功能构建来创建XML文档的方式。 这太好了。 DOM比较笨重。

我现在正在学习XmlDocument但是我刚刚遇到了XDocument并且当我尝试搜索它们的差异或好处时,我找不到有用的东西,请告诉我为什么要使用一个而不是另一个?


XmlDocument非常适合熟悉XML DOM对象模型的开发人员。 它已经存在了一段时间,或多或少符合W3C标准。 它支持手动导航以及XPath节点选择。

XDocument在.NET 3.5中支持LINQ to XML功能。 它大量使用IEnumerable<>并且可以更容易地使用直接的C#。

两种文档模型都要求您将整个文档加载到内存中(例如,与XmlReader不同)。


如果您使用的是.NET 3.0或更低版本, 必须使用XmlDocument (又称经典DOM API)。 同样,你会发现有一些其他的API会期待这一点。

但是,如果您选择了,我会彻底推荐使用XDocument即LINQ 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 XmlWriter式XML的XmlWriter方式,但您可以在一定程度上混合使用所有API。 例如,您可以流式处理一个大文档,但是可以通过在元素开头定位XmlReader ,从中读取XElement并处理它,然后转到下一个元素等来使用LINQ to XML。有各种关于此的博客文章技术, 这是我通过快速搜索找到的


我很惊讶迄今为止没有任何答案提到XmlDocument提供行信息 ,而XDocument (通过IXmlLineInfo接口)。

在某些情况下,这可能是一个关键功能(例如,如果要报告XML中的错误,或者跟踪通常定义的元素的位置),并且您在使用XmlDocument开始实施之前最好了解这一点,以便后来发现你必须改变这一切。


正如其他地方所提到的,毫无疑问,与XmlDocument相比,Linq to Xml使创建和更改xml文档变得轻而易举,并且在处理命名空间时, XNamespace ns + "elementName"语法使XNamespace ns + "elementName"愉快。

值得一提的xslxpath值得注意的是,它仍然可以在Linq 2 Xml XNodes上执行任意xpath 1.0表达式,其中包括:

using System.Xml.XPath;

然后我们可以通过这些扩展方法使用xpath导航和投影数据:

例如,给定Xml文档:

<xml>
    <foo>
        <baz id="1">10</baz>
        <bar id="2" special="1">baa baa</bar>
        <baz id="3">20</baz>
        <bar id="4" />
        <bar id="5" />
    </foo>
    <foo id="123">Text 1<moo />Text 2
    </foo>
</xml>

我们可以评估:

var node = xele.XPathSelectElement("/xml/foo[@id='123']");
var nodes = xele.XPathSelectElements(
"//moo/ancestor::xml/descendant::baz[@id='1']/following-sibling::bar[not(@special='1')]");
var sum = xele.XPathEvaluate("sum(//foo[not(moo)]/baz)");

除了上面的W0lands注释之外,在为Windows 8构建Unity3D项目时同样适用。在这种情况下,您也需要使用XDocument。





linq-to-xml