XDocument或XmlDocument


501

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


13
我想知道为什么Microsoft的文档编制人员没有在MSDN中添加任何注释或备注来阐明它们之间的差异或何时使用它们。
卡姆兰·比格德利

1
有关msdn的一些信息:msdn.microsoft.com/en-us/library/…。还有一个性能问题:stackoverflow.com/questions/4383919/…。我个人发现使用LINQ to XML更容易。
nawfal

Answers:


500

如果您使用的是.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从中读取并处理它,然后继续进行下一个元素等。有关此技术的博客文章很多,这是我通过快速搜索发现的


你能告诉我为什么他们不同吗?我是说XDocument看起来很整洁,但对于DOM级别差异,不是都是xml吗,有没有显示Microsoft X-DOM和W3C兼容DOM的方案?谢谢。
塔里克

3
您所说的“方案”是什么意思,您所说的“表演”是什么意思?是的,它们都处理标准XML,但是LINQ to XML只是大多数情况下更好的API。在.NET 3.5之前,LINQ to XML 背后的许多技术根本不可用。
乔恩·斯基特

我的意思是他们的文档对象模型是否不同?
塔里克

6
好吧,它们都是XML本身的API,因此从某种意义上说,它们没有什么不同,没有。我怀疑两者都有一定的局限性(我知道一个LINQ to XML的局限性,但我想不起来了),但是在大多数情况下,您可以将它们视为相同的模型,只是表示形式有所不同。
乔恩·斯基特

1
@SensorSmith:但是,这还不包括所有其他好处,例如序列的自动变平,DateTime的处理等。您也可以添加所有扩展方法,但是为什么可以重新使用LINQ to XML呢?
乔恩·斯基特

57

我的答案都不感到惊讶到目前为止提到的事实XmlDocument没有提供行信息,而XDocument不会(通过IXmlLineInfo接口)。

在某些情况下,这可能是至关重要的功能(例如,如果您要报告XML中的错误,或跟踪元素在一般情况下定义的位置),因此在开始愉快地使用XmlDocument,稍后实现之前,最好先了解这一点。发现您必须改变这一切。


1
我感到惊讶的是,没有人注意到您的说法是相反的。XmlDocument会提供行信息,而XDocument不会。
VVS

4
@VVS:您让我担心我犯了一个糟糕的错字,但是经过仔细检查,我确认XDocument确实提供了线路信息。见XDocument.LoadLoadOptions.SetLineInfo作为第二个参数。如果您知道与XmlDocument我联系的方式,我很好奇;回到我写这个答案时,我找不到任何答案。这个其他答案似乎可以确认:stackoverflow.com/a/33622102/253883
朱利安·盖尔特

1
“并且最好在开始使用XmlDocument进行实现之前意识到这一点,以便以后发现必须进行全部更改。” 猜猜我刚才做了什么:)
保罗

36

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

XDocumentNET 3.5中的LINQ to XML功能。它大量使用IEnumerable<>并且可以更轻松地在直接C#中使用。

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


3
我认为您的意思是“并且可以在直接的VB.net中更轻松地使用它”。因为VB支持直接创建C#仍需要代码的元素。
Brain2000

24

XDocument是从LINQ到XML API,并且XmlDocument是XML 的标准DOM样式API。如果您精通DOM,并且不想学习LINQ to XML,请使用XmlDocument。如果您不熟悉两者,请查看此页面,将两者进行比较,然后选择外观更佳的一个。

我刚刚开始使用LINQ to XML,我喜欢使用函数构造创建XML文档的方式。这太好了。DOM比较笨拙。


23

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

有一个件事值得一提的xslxpath模具顽固派要注意的是,它仍然可能执行任意xpath 1.0LINQ的2版XML表达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)");

14

另外,请注意XDocumentXbox 360和Windows Phone OS 7.0支持。如果您以他们为目标,请为进行开发XDocument或从进行迁移XmlDocument


-8

我相信这XDocument会产生更多的对象创建调用。我怀疑当您处理大量XML文档时,XMLDocument速度会更快。

发生这种情况的一个地方是管理扫描数据。许多扫描工具都以XML输出数据(出于明显的原因)。如果您必须处理许多此类扫描文件,我想您会获得更好的性能XMLDocument


11
我认为您下次应该用数字来支持您的评论,因为我认为您可能是错的。参见blogs.msdn.com/b/codejunkie/archive/2008/10/08/…–
mike
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.