Tar*_*rik 487 c# xml xmldocument linq-to-xml
我现在正在学习,XmlDocument但我刚刚遇到XDocument,当我试图搜索他们的差异或好处时,我找不到有用的东西,你能告诉我为什么你会使用一个而不是另一个吗?
Jon*_*eet 488
如果您使用的是.NET 3.0或更低版本,则必须使用XmlDocumentaka经典DOM API.同样,你会发现还有一些其他的API可以期待这一点.
但是,如果你做出了选择,我会完全建议使用XDocumentaka 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);
Run Code Online (Sandbox Code Playgroud)
和
XDocument doc = new XDocument(
new XElement("root",
new XAttribute("name", "value"),
new XElement("child", "text node")));
Run Code Online (Sandbox Code Playgroud)
在LINQ to XML中,命名空间非常容易使用,与我见过的任何其他XML API不同:
XNamespace ns = "http://somewhere.com";
XElement element = new XElement(ns + "elementName");
// etc
Run Code Online (Sandbox Code Playgroud)
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
));
Run Code Online (Sandbox Code Playgroud)
它具有更多的声明性,符合一般的LINQ风格.
正如Brannon所提到的,这些是内存中的API而不是流式API(尽管XStreamingElement支持延迟输出).XmlReader并且XmlWriter是在.NET中流式传输XML的常规方法,但您可以在某种程度上混合所有API.例如,您可以流式传输大型文档但使用LINQ to XML,方法是XmlReader在元素的开头放置一个元素,XElement从中读取并处理它,然后转到下一个元素等.有关此技术的各种博客文章,这是我通过快速搜索找到的.
Jul*_*ult 56
我的答案都不感到惊讶到目前为止提到的事实XmlDocument没有提供行信息,而XDocument不会(通过IXmlLineInfo接口).
这可能是在某些情况下,一个关键特性(例如,如果你想在一个XML报告错误,或跟踪其中的元素一般定义的),你最好是意识到这一点之前,你高高兴兴地开始实施使用XmlDocument,到后来发现你必须改变一切.
Bra*_*non 35
XmlDocument对于熟悉XML DOM对象模型的开发人员来说非常棒.它已经存在了一段时间,或多或少与W3C标准相对应.它支持手动导航和XPath节点选择.
XDocument支持.NET 3.5中的LINQ to XML功能.它大量使用IEnumerable<>并且可以更容易地在直接C#中使用.
两种文档模型都要求您将整个文档加载到内存中(与XmlReader示例不同).
Stu*_*tLC 22
正如其他地方所提到的,毫无疑问,Linq to Xml使得创建和更改xml文档变得轻而易举XmlDocument,并且XNamespace ns + "elementName"语法在处理命名空间时会产生令人愉悦的读取.
有一两件事值得一提的xsl和xpath死顽固派要注意的是,它仍然可能执行任意xpath 1.0LINQ的2版XML表达XNodes的,包括:
using System.Xml.XPath;
Run Code Online (Sandbox Code Playgroud)
然后我们可以使用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>
Run Code Online (Sandbox Code Playgroud)
我们可以评估:
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)");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
180844 次 |
| 最近记录: |