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
支持延迟输出)。 XmlReader
和XmlWriter
是.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"
愉快。
值得一提的xsl
和xpath
值得注意的是,它仍然可以在Linq 2 Xml XNodes
上执行任意xpath 1.0
表达式,其中包括:
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)");
除了上面的W0lands注释之外,在为Windows 8构建Unity3D项目时同样适用。在这种情况下,您也需要使用XDocument。