当前位置:  开发笔记 > 编程语言 > 正文

XDocument或XmlDocument

如何解决《XDocument或XmlDocument》经验,为你挑选了6个好方法。

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



1> Jon Skeet..:

如果您使用的是.NET 3.0或更低版本,必须使用XmlDocumentaka经典DOM API.同样,你会发现还有一些其他的API可以期待这一点.

但是,如果你做出了选择,我会完全建议使用XDocumentaka 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
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支持延迟输出).XmlReader并且XmlWriter是在.NET中流式传输XML的常规方法,但您可以在某种程度上混合所有API.例如,您可以流式传输大型文档但使用LINQ to XML,方法是XmlReader在元素的开头放置一个元素,XElement从中读取并处理它,然后转到下一个元素等.有关此技术的各种博客文章,这是我通过快速搜索找到的.


那么它们都是XML本身的API,所以在这个意义上它们没有区别,没有.我怀疑它们都有一些限制(并且有一个我知道但不记得的LINQ to XML)但在大多数情况下,你可以将它们视为具有略微不同表示的相同模型.
"计划"是什么意思,"节目"是什么意思?是的,他们都处理标准的XML,但LINQ to XML对于大多数事情来说只是一个更好的API.在.NET 3.5之前,很少有*LINQ to XML背后的技术*.

2> Julien Guert..:

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

这可能是在某些情况下,一个关键特性(例如,如果你想在一个XML报告错误,或跟踪其中的元素一般定义的),你最好是意识到这一点之前,你高高兴兴地开始实施使用XmlDocument,到后来发现你必须改变一切.


@VVS:你让我担心我做了一个可怕的拼写错误,但经过仔细检查后,我确认`XDocument`确实提供了行信息.请参阅[XDocument.Load](https://msdn.microsoft.com/en-us/library/bb538371%28v=vs.110%29.aspx),并将"LoadOptions.SetLineInfo"作为第二个参数.如果您知道使用`XmlDocument`获取行信息的方法,我很好奇; 当我写这个答案时,我找不到任何答案.其他答案似乎证实:/sf/ask/17360801/

3> Brannon..:

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

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

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


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

4> Daniel Chamb..:

XDocument是从LINQ到XML API,并且XmlDocument是XML 的标准DOM样式API.如果您熟悉DOM,并且不想学习LINQ to XML,请继续XmlDocument.如果你是两个新手,请查看这个比较两者的页面,然后选择你喜欢哪一个更好看的.

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



5> StuartLC..:

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

有一两件事值得一提的xslxpath死顽固派要注意的是,它仍然可能执行任意xpath 1.0LINQ的2版XML表达XNodes的,包括:

using System.Xml.XPath;

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

XPathSelectElement - 单个元素

XPathSelectElements - 节点集

XPathEvaluate - Scalars和其他人

例如,给定Xml文档:


    
        10
        baa baa
        20
        
        
    
    Text 1Text 2
    

我们可以评估:

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



6> 小智..:

另请注意,XDocumentXbox 360和Windows Phone OS 7.0支持此功能.如果您定位它们,则开发XDocument或迁移XmlDocument.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有