2012-06-19 70 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。