我现在正在学习,XmlDocument
但我刚刚遇到XDocument
,当我试图搜索他们的差异或好处时,我找不到有用的东西,你能告诉我为什么你会使用一个而不是另一个吗?
如果您使用的是.NET 3.0或更低版本,则必须使用XmlDocument
aka经典DOM API.同样,你会发现还有一些其他的API可以期待这一点.
但是,如果你做出了选择,我会完全建议使用XDocument
aka 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 ListXElement 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,方法是XmlReader
在元素的开头放置一个元素,XElement
从中读取并处理它,然后转到下一个元素等.有关此技术的各种博客文章,这是我通过快速搜索找到的.
我的答案都不感到惊讶到目前为止提到的事实XmlDocument
没有提供行信息,而XDocument
不会(通过IXmlLineInfo
接口).
这可能是在某些情况下,一个关键特性(例如,如果你想在一个XML报告错误,或跟踪其中的元素一般定义的),你最好是意识到这一点之前,你高高兴兴地开始实施使用XmlDocument
,到后来发现你必须改变一切.
XmlDocument
对于熟悉XML DOM对象模型的开发人员来说非常棒.它已经存在了一段时间,或多或少与W3C标准相对应.它支持手动导航和XPath
节点选择.
XDocument
支持.NET 3.5中的LINQ to XML功能.它大量使用IEnumerable<>
并且可以更容易地在直接C#中使用.
两种文档模型都要求您将整个文档加载到内存中(与XmlReader
示例不同).
XDocument
是从LINQ到XML API,并且XmlDocument
是XML 的标准DOM样式API.如果您熟悉DOM,并且不想学习LINQ to XML,请继续XmlDocument
.如果你是两个新手,请查看这个比较两者的页面,然后选择你喜欢哪一个更好看的.
我刚开始使用LINQ to XML,我喜欢使用功能构建创建XML文档的方式.这太好了.相比之下,DOM很笨拙.
正如其他地方所提到的,毫无疑问,Linq to Xml使得创建和更改xml文档变得轻而易举XmlDocument
,并且XNamespace ns + "elementName"
语法在处理命名空间时会产生令人愉悦的读取.
有一两件事值得一提的xsl
和xpath
死顽固派要注意的是,它仍然可能执行任意xpath 1.0
LINQ的2版XML表达XNodes
的,包括:
using System.Xml.XPath;
然后我们可以使用xpath
这些扩展方法导航和投影数据:
XPathSelectElement - 单个元素
XPathSelectElements - 节点集
XPathEvaluate - Scalars和其他人
例如,给定Xml文档:
10 baa baa 20 Text 1 Text 2
我们可以评估:
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
Xbox 360和Windows Phone OS 7.0支持此功能.如果您定位它们,则开发XDocument
或迁移XmlDocument
.