2009-07-28 48 views
3

我有一個XML文件,它具有以下結構:C#和XPath - 如何查詢

<mediawiki ...> 
    <siteinfo>...</siteinfo> 
    <page> 
    <title>The Title</title> 
    <id>42</id> 
    ... 
    </page> 
    ... more page items ... 
</mediawiki> 

我紅了一下有關XPath查詢和寫了下面的代碼:

_xmlArticlesDocument = new XmlDocument(); 
_xmlArticlesDocument.Load(xmlArticlesFileName); 

現在我想抓住一個頁面元素與給定的id-Subelement。所以我寫道:

XmlNode node = _xmlArticlesDocument.DocumentElement.SelectSingleNode 
       ("//mediawiki/page[id=" + id.ToString() + "]"); 

但是節點總是空的。我已經嘗試了幾個查詢,其中包括「page/id」,「page」,「/ page」,「// page」以獲得什麼,但節點始終爲空。我通過快速檢查_xmlArticlesDocument變量進行了檢查,並且它包含具有預期結構的正確XML文件。

在我看來,我錯過了一些非常基本的東西,但不知道是什麼。也許這裏有人有一個想法?

由於提前, 弗蘭克

回答

5

該查詢看起來是正確的,基於您向我們展示的內容。然而,我懷疑behin是mediawiki元素上的「...」,這裏有一個xmlns =「....」屬性吧?

這會是什麼讓你惹我懷疑。你將需要這樣的代碼: -

XmlNamespaceManager nsmgr = new XmlNamespaceManager(_xmlArticlesDocument.NameTable); 
nsmgr.AddNamespace("a", "the-namespace-in-them-xmlns-attribute"); 
XmlNode page = _xmlArticlesDocument.SelectSingleNode(String.Format("//a:page[id={0}]", id), nsmgr); 
3

你試過:

_xmlArticlesDocument.DocumentElement.SelectSingleNode 
       ("page[id='" + id.ToString() + "']"); // Note the single quotes 

而且,如果所有的XML節點都是在命名空間不是默認的(即<mediawiki xmlns="whatever">),那麼你是還需要一個XmlNamespaceManager

+0

//應將查詢移動到文檔的開頭。 – AnthonyWJones 2009-07-28 14:59:38

+0

我沒有建議使用// ...或者我不理解你的觀點? – 2009-07-28 15:01:34

+0

不要忘記確保`id`不包含單引號,否則`SelectSingleNode()`將因XPath無效而失敗。 – Tomalak 2009-07-28 15:08:17

2

檢查Linq到XML。我也是一個XML noob,我發現它更容易,XMLDocument。