在我们正在开发的一个应用程序中,我们进行了大量的XML处理。目前我们使用DOM和XPath进行大部分处理,我们对性能不太满意。
目前我们正在考虑将XML处理逻辑转移到LINQ,我们的初步调查显示LINQ性能远优于DOM。
在进行这些更改之前,我想知道其他人对此的看法。使用LINQ是更好的选择吗?任何不满等...
谢谢, Shamika
非常感谢您的回答。我做了一些性能测试,正如预期的那样,XmlReader out执行了XmlDocument和LINQ。请注意,这仅适用于XML阅读。
此外,如果您需要LINQ的易用性,您可以通过使用XmlReader的某些功能来实现LINQ XML处理,并且可以获得比XmlDocument更好的性能。有关更多信息,请参阅“rwwilden”评论。
感谢。
答案 0 :(得分:3)
使用DOM(即System.Xml.XmlDocument
)可能会更慢,因为丰富的导航支持(所有这些引用开始加起来),并且随着节点数量的增加,这种开销将变得更加重要。
更简单的对象模型(System.Xml.Linq.XDocument
和System.Xml.XPath.XPathDocument
)没有这种复杂的结构,但允许通过其他方式进行导航。这可能会增加CPU开销,但应节省内存。
最后,您需要对案例中的(时间和空间)进行分析,并考虑它所产生的真实(用户感知)差异。
但是,为了达到最佳性能,根本不要将整个文档加载到内存中:使用System.Xml.XmlReader
和System.Xml.XmlWriter
并在流中执行所有操作。当然这会增加开发成本。
.NET有一套丰富的(可能太丰富的)XML API,这对你来说是最好的(或者至少是最差的),只能由你做出最适合你的权衡。
就我个人而言,我会避免使用XmlDocument
并使用XPathDocument
(特别是阅读和使用XPath查询)或XDocument
(尤其是创建)XmlReader
/ {{ 1}}没有提供足够的性能提升来证明其合理性。
答案 1 :(得分:2)
我不确定您是否会注意到使用LINQ2XML而非DOM / XPath的性能提升非常大。对于DOM和LINQ2XML,您迭代的文档都表示为内存中的树。
如果性能确实存在问题并且您有相当大的XML文档,那么您可以查看框架中实现的基本XML流支持(通过XStreamingElement
)。另请查看此Microsoft XML团队blog entry。
答案 2 :(得分:1)
我对它的看法是LINQ - > XML比DOM更容易使用。这对我来说更直观,更容易阅读IMO。