我现在正在学习,XmlDocument
但是我碰到了什么XDocument
,当我尝试搜索它们的区别或好处时,我找不到有用的东西,您能否告诉我为什么您要使用另一个?
我现在正在学习,XmlDocument
但是我碰到了什么XDocument
,当我尝试搜索它们的区别或好处时,我找不到有用的东西,您能否告诉我为什么您要使用另一个?
Answers:
如果您使用的是.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中流式XML的常规方法一样,但是您可以在一定程度上混合所有API。例如,您可以流式传输大型文档,但可以使用LINQ to XML,方法是将an XmlReader
放在元素的开头,XElement
从中读取并处理它,然后继续进行下一个元素等。有关此技术的博客文章很多,这是我通过快速搜索发现的。
我的答案都不感到惊讶到目前为止提到的事实XmlDocument
没有提供行信息,而XDocument
不会(通过IXmlLineInfo
接口)。
在某些情况下,这可能是至关重要的功能(例如,如果您要报告XML中的错误,或跟踪元素在一般情况下定义的位置),因此在开始愉快地使用XmlDocument
,稍后实现之前,最好先了解这一点。发现您必须改变这一切。
XDocument
确实提供了线路信息。见XDocument.Load与LoadOptions.SetLineInfo
作为第二个参数。如果您知道与XmlDocument
我联系的方式,我很好奇;回到我写这个答案时,我找不到任何答案。这个其他答案似乎可以确认:stackoverflow.com/a/33622102/253883
就像在其他地方所提到的,与相比,Linq to Xml无疑使xml文档的创建和更改变得轻而易举XmlDocument
,并且XNamespace ns + "elementName"
在处理名称空间时,该语法使阅读变得轻松愉快。
有一个件事值得一提的xsl
和xpath
模具顽固派要注意的是,它仍然可能执行任意xpath 1.0
LINQ的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)");
我相信这XDocument
会产生更多的对象创建调用。我怀疑当您处理大量XML文档时,XMLDocument
速度会更快。
发生这种情况的一个地方是管理扫描数据。许多扫描工具都以XML输出数据(出于明显的原因)。如果您必须处理许多此类扫描文件,我想您会获得更好的性能XMLDocument
。