XDocument或XmlDocument

我现在正在学习XmlDocument但是我刚刚遇到了XDocument ,当我尝试search它们的差别或者好处的时候,我找不到有用的东西,请告诉我为什么你会使用另一个呢?

如果您使用的是.NET 3.0或更低版本, 必须使用XmlDocument也就是传统的DOM API。 同样,你会发现有一些其他的API会期待这一点。

如果你有select,但是我会彻底推荐使用XDocument即LINQ to XML。 创build文档并处理它们简单得多。 例如,它的区别在于:

 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也非常有效 – 它的构build模型允许您轻松地构build具有子元素序列的元素:

 // 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,而不是stream式API(尽pipeXStreamingElement支持延迟输出)。 XmlReaderXmlWriter是在.NET XmlWriter式传输XML的XmlWriter方式,但是您可以在一定程度上混合使用所有的API。 例如,你可以通过在一个元素的开头定位一个XmlReader ,从它读取一个XElement并处理它,然后移动到下一个元素等等来使用LINQ to XML来stream式处理一个大的文档。技术, 这里有一个我发现一个快速search 。

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

在某些情况下,这可能是一个关键的function(例如,如果您想要报告XML中的错误,或者跟踪通常定义的元素的位置),在使用XmlDocument愉快地开始实现之前,您最好意识到这一点,后来发现你必须改变这一切。

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

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

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

XDocument是从LINQ到XML API,而XmlDocument是用于XML的标准DOM风格的API。 如果你很了解DOM,而不想学习LINQ to XML,那就用XmlDocument 。 如果你是新手,可以看看这个比较两者的页面 ,然后select你喜欢哪一个更好看。

我刚刚开始使用LINQ to XML,我喜欢用function构build来创buildXML文档的方式。 这太好了。 DOM比较笨重。

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

有一点值得一提的xslxpath值得注意的是,仍然可以在Linq 2 Xml XNodes上执行任意的xpath 1.0expression式,包括:

 using System.Xml.XPath; 

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

  • XPathSelectElement – 单个元素
  • XPathSelectElements – 节点集
  • XPathEvaluate – 标量和其他

例如,给定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)"); 

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

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

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

发生这种情况的一个地方是pipe理扫描数据。 许多扫描工具以XML(以显而易见的原因)输出他们的数据。 如果你必须处理大量的这些扫描文件,我想你会有更好的XMLDocument性能。