XDocument或XmlDocument
我现在正在学习XmlDocument
但是我刚刚遇到了XDocument
,当我尝试search它们的差别或者好处的时候,我找不到有用的东西,请告诉我为什么你会使用另一个呢?
如果您使用的是.NET 3.0或更低版本, 则必须使用XmlDocument
也就是传统的DOM API。 同样,你会发现有一些其他的API会期待这一点。
如果你有select,但是我会彻底推荐使用XDocument
即LINQ to XML。 创build文档并处理它们要简单得多。 例如,它的区别在于:
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也非常有效 – 它的构build模型允许您轻松地构build具有子元素序列的元素:
// 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,而不是stream式API(尽pipeXStreamingElement
支持延迟输出)。 XmlReader
和XmlWriter
是在.NET XmlWriter
式传输XML的XmlWriter
方式,但是您可以在一定程度上混合使用所有的API。 例如,你可以通过在一个元素的开头定位一个XmlReader
,从它读取一个XElement
并处理它,然后移动到下一个元素等等来使用LINQ to XML来stream式处理一个大的文档。技术, 这里有一个我发现一个快速search 。
我很惊讶,到目前为止没有任何答案提到XmlDocument
提供行信息 ,而XDocument
(通过IXmlLineInfo
接口)。
在某些情况下,这可能是一个关键的function(例如,如果您想要报告XML中的错误,或者跟踪通常定义的元素的位置),在使用XmlDocument
愉快地开始实现之前,您最好意识到这一点,后来发现你必须改变这一切。
XmlDocument
非常适合熟悉XML DOM对象模型的开发人员。 它已经存在了一段时间,或多或less对应于W3C标准。 它支持手动导航以及XPath
节点select。
XDocument
在.NET 3.5中支持LINQ to XML特性。 它大量使用IEnumerable<>
,可以更容易地使用直接的C#。
这两个文档模型都要求您将整个文档加载到内存中(与XmlReader
不同)。
XDocument
是从LINQ到XML API,而XmlDocument
是用于XML的标准DOM风格的API。 如果你很了解DOM,而不想学习LINQ to XML,那就用XmlDocument
。 如果你是新手,可以看看这个比较两者的页面 ,然后select你喜欢哪一个更好看。
我刚刚开始使用LINQ to XML,我喜欢用function构build来创buildXML文档的方式。 这太好了。 DOM比较笨重。
正如其他地方所提到的,毫无疑问,与XmlDocument
相比,Linq to Xml使创build和更改xml文档变得轻而易举,并且在处理命名空间时, XNamespace ns + "elementName"
语法使得XNamespace ns + "elementName"
愉快。
有一点值得一提的xsl
和xpath
值得注意的是,仍然可以在Linq 2 Xml XNodes
上执行任意的xpath 1.0
expression式,包括:
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)");
此外,请注意Xbox 360和Windows Phone OS 7.0支持XDocument
。 如果您定位它们,请为XDocument
开发或从XmlDocument
迁移。
除了上面的W0lands注释之外,在构buildWindows 8的Unity3D项目时同样适用。在这种情况下,您也需要使用XDocument。
我相信XDocument
会创build更多的对象创build调用。 我怀疑,当你处理大量的XML文档时, XMLDocument
会更快。
发生这种情况的一个地方是pipe理扫描数据。 许多扫描工具以XML(以显而易见的原因)输出他们的数据。 如果你必须处理大量的这些扫描文件,我想你会有更好的XMLDocument
性能。