【问题标题】:XDocument or XmlDocumentXDocument 或 XmlDocument
【发布时间】:2010-12-05 06:03:00
【问题描述】:

我现在正在学习XmlDocument,但我刚刚遇到XDocument,当我尝试搜索它们的区别或好处时,我找不到有用的东西,你能告诉我你为什么要使用一个吗?在另一个?

【问题讨论】:

标签: c# xml xmldocument linq-to-xml


【解决方案1】:

如果您使用 .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 支持延迟输出)。 XmlReaderXmlWriter 是 .NET 中流式传输 XML 的常规方式,但您可以在一定程度上混合使用所有 API。例如,您可以通过将XmlReader 定位在元素的开头,从中读取XElement 并对其进行处理,然后移动到下一个元素等来流式传输大型文档,但使用 LINQ to XML。关于这项技术的博文,here's one I found with a quick search

【讨论】:

  • 你能告诉我为什么它们不同吗?我的意思是,XDocument 看起来很整洁,但至于 DOM 级别的差异,它们不是都是 xml,有没有任何方案可以同时显示 Microsoft X-DOM 和 W3C Compliant DOM ?谢谢。
  • “方案”是什么意思,“节目”是什么意思?是的,它们都处理标准 XML,但 LINQ to XML 对于大多数事情来说只是一个更好的 API。在 .NET 3.5 之前,很多背后 LINQ to XML 的技术根本不可用。
  • 我的意思是他们的文档对象模型是否不同?
  • 嗯,它们都是 XML 本身的 API,所以从这个意义上说,它们并没有什么不同,不。我怀疑两者都有一些限制(我知道有一个 LINQ to XML,但我不记得了)但在大多数情况下,您可以将它们视为相同的模型,但表示形式略有不同。
  • @SensorSmith:但这并没有涵盖所有其他好处,例如序列的自动展平、日期时间的处理等。您也可以为所有这些添加扩展方法,但是为什么要重新发明 LINQ to XML你可以改用它吗?
【解决方案2】:

令我惊讶的是,到目前为止,没有一个答案提到 XmlDocument 不提供线路信息,而 XDocument 提供(通过 IXmlLineInfo 接口)。

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

【讨论】:

  • 我很惊讶没有人注意到你的陈述是相反的。 XmlDocument 提供行信息,而 XDocument 不提供。
  • @VVS:你让我担心我犯了一个可怕的错字,但经过仔细检查,我确认 XDocument 确实提供了线路信息。请参阅 XDocument.LoadLoadOptions.SetLineInfo 作为第二个参数。如果您知道使用XmlDocument 获取线路信息的方法,我很好奇;当我写这个答案时,我找不到任何答案。这个其他答案似乎证实了:stackoverflow.com/a/33622102/253883
  • "在您愉快地开始使用 XmlDocument 实现之前,您最好意识到这一点,以便以后发现您必须全部更改。"猜猜我刚刚做了什么:)
【解决方案3】:

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

XDocument 支持 .NET 3.5 中的 LINQ to XML 功能。它大量使用了IEnumerable&lt;&gt;,并且可以更容易地在直接的 C# 中使用。

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

【讨论】:

  • 我认为你的意思是“并且可以更容易地在直接的 VB.net 中使用”。因为 VB 支持直接创建 C# 仍然需要代码的元素。
【解决方案4】:

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

对于xslxpath 来说,值得一提的是,仍然可以在Linq 2 Xml XNodes 上执行任意xpath 1.0 表达式,包括:

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

【讨论】:

    【解决方案5】:

    XDocument 来自 LINQ to XML API,XmlDocument 是用于 XML 的标准 DOM 样式 API。如果您非常了解 DOM,并且不想学习 LINQ to XML,请使用XmlDocument。如果您对两者都不熟悉,请查看比较两者的 this page,然后选择您更喜欢哪个外观。

    我刚刚开始使用 LINQ to XML,我喜欢您使用函数式构造创建 XML 文档的方式。这太好了。相比之下,DOM 就显得笨重了。

    【讨论】:

      【解决方案6】:

      另外,请注意XDocument 在 Xbox 360 和 Windows Phone OS 7.0 中受支持。 如果您以他们为目标,请为XDocument 开发或从XmlDocument 迁移。

      【讨论】:

        【解决方案7】:

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

        发生这种情况的一个地方是管理扫描数据。许多扫描工具以 XML 格式输出数据(原因很明显)。如果您必须处理大量此类扫描文件,我认为使用XMLDocument 会有更好的性能。

        【讨论】:

        猜你喜欢
        • 2011-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多