我现在正在学习,XmlDocument但是我碰到了什么XDocument,当我尝试搜索它们的区别或好处时,我找不到有用的东西,您能否告诉我为什么您要使用另一个?
我现在正在学习,XmlDocument但是我碰到了什么XDocument,当我尝试搜索它们的区别或好处时,我找不到有用的东西,您能否告诉我为什么您要使用另一个?
Answers:
如果您使用的是.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");
// etcLINQ 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.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)");我相信这XDocument会产生更多的对象创建调用。我怀疑当您处理大量XML文档时,XMLDocument速度会更快。
发生这种情况的一个地方是管理扫描数据。许多扫描工具都以XML输出数据(出于明显的原因)。如果您必须处理许多此类扫描文件,我想您会获得更好的性能XMLDocument。