XDocument或XmlDocument

时间:2009-10-09 06:19:08

标签: c# xml xmldocument linq-to-xml

我现在正在学习XmlDocument,但我刚刚遇到XDocument,当我试图搜索它们的不同或好处时,我找不到有用的东西,请你告诉我为什么你会用另一个吗?

8 个答案:

答案 0 :(得分:474)

如果您使用的是.NET 3.0或更低版本,则 使用XmlDocument即经典DOM API。同样地,你会发现还有一些其他的API可以期待这个。

但是,如果您做出选择,我会完全建议使用XDocument aka 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中流式传输XML的常用方法,但您可以在某种程度上混合使用所有API。例如,您可以流式传输大型文档,但使用LINQ to XML,方法是在元素的开头放置XmlReader,从中读取XElement并处理它,然后转到下一个元素等有关此技术的各种博客文章here's one I found with a quick search

答案 1 :(得分:53)

我很惊讶到目前为止没有一个答案提到 XmlDocument没有提供行信息这一事实,而 XDocument(通过IXmlLineInfo界面)。

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

答案 2 :(得分:34)

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

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

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

答案 3 :(得分:23)

XDocument来自LINQ to XML API,XmlDocument是XML的标准DOM样式API。如果您熟悉DOM,并且不想学习LINQ to XML,请使用XmlDocument。如果你是两个新手,请查看比较两者的this page,然后选择你喜欢哪一个更好。

我刚开始使用LINQ to XML,我喜欢使用功能构建创建XML文档的方式。这太好了。相比之下,DOM很笨拙。

答案 4 :(得分:21)

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

值得一提的是xslxpath需要注意的一点是,通过包含以下内容,仍然可以在Linq 2 Xml xpath 1.0上执行任意XNodes个表达式:

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)");

答案 5 :(得分:14)

另请注意,Xbox 360和Windows Phone OS 7.0支持XDocument。 如果您定位它们,请为XDocument开发,或从XmlDocument进行迁移。

答案 6 :(得分:3)

除了上面的W0lands评论之外,在为Windows 8构建Unity3D项目时也是如此。在这种情况下,您还需要使用XDocument。

答案 7 :(得分:-9)

我相信XDocument会进行更多的对象创建调用。我怀疑,当你处理大量XML文档时,XMLDocument会更快。

发生这种情况的一个方面是管理扫描数据。许多扫描工具以XML格式输出数据(原因很明显)。如果您必须处理大量这些扫描文件,我认为使用XMLDocument可以获得更好的效果。