2012-06-19 138 views
2

我在C#.net 4.0中使用XMLReader来搜索一小段XML。我想查找XML中的特定元素,并使用XMLReader.ReadToFollowing("name")方法查找元素。我不知道XML文档中元素的顺序;他们处于不同的次序或完全失踪。顺序对我无关紧要,但是如果元素缺失,我会抛出一个异常。C#XML解析 - 搜索特定元素

XMLReader只是前向的,所以如果我要查找的第一个元素是XML文档中的最后一个值,则额外的读取操作将失败。

我正在考虑为每个搜索创建一个新的XMLReader。我只有一小部分元素可供查找,而且XML不是很大,所以我不认为会有太多开销,但我可能是错的。

当您不知道元素的顺序时,是否有更好的库用于搜索XML?或者,XML中的订单缺乏违反XML规范?

具体来说,假设我有一些简单的XML。一个头和10个孩子。

<sometag> 
    <element1>data</element1> 
    <element2>data</element2> 
    . 
    . 
    . 
    <element10>data</element10> 
</sometag> 

打开5个XMLReader来查找这些元素会是低效吗?我也可以使用一个阅读器并逐步浏览每个元素,但是之后我需要跟踪我找到的元素。

+0

如果您有一个XML示例,有几种方法可以做到这一点。我相信很多人会很乐意发表一些具体的例子 - 我知道我会!你可以采取的其他方法是通过XmlDocument和XPath使用基于DOM的解析 - http://msdn.microsoft.com/en-us/library/system.xml.xmldocument或更现代的XDocument类 - http:// msdn .microsoft.com/en-us/library/system.xml.linq.xdocument.aspx – dash

回答

4

相反的XMLReader的,你可以使用XDocument(linq2xml),做(由Element法)快速和容易。

+0

您是否认为创建XDocument的开销比打开5个XMLReaders大?你认为开放$ Y XMLReaders会比XDocument慢吗?还是真的没有太大的区别? – Rastapopulous

+0

@Rastapopulous,我以前自己测试一下,无论如何,最好学习使用xdocument和linq,因为它很容易对xml文件做任何事情,这些文件很难与其他xml组件一起使用,在这里当你的文件很小时没有性能差异,但代码非常简单,维护更容易,开发速度更快。 –

0

尝试使用XPath。它要快得多,对元素的顺序不敏感(只有层次结构)。

MSDN文档: http://msdn.microsoft.com/en-us/library/ms256086.aspx

编程使用XPath确实需要一点学习的。如果你的XML指定了一个命名空间,你需要确保将它包含在你的XPath查询中。你喜欢不重新加载XML文件

var doc = XDocument.Load(xmlFilePath); 
var element1 = doc.Element(searchItemName); 
if (element1 == null) throw ... 
... 
return ....; 

你可以把它尽可能多的时间:

0

你有.NET 4.0,所以使用Linq到XML。