2011-06-29 29 views
2

我有一個xml文件,我正在嘗試使用c#獲取所有特定節點的列表。我的Xpath有什麼問題?

一個下調我的XML的版本是:

<file> 
    <AnotherNode> 
    </AnotherNode> 
    <ROWS> 
     <row> 
      <code>Code1</code> 
      <R>1</R> 
      <G>2</G> 
      <B>3</B> 
     </row> 
     <row> 
      <code>Code2</code> 
      <R>1</R> 
      <G>2</G> 
      <B>3</B> 
     </row> 
    </ROWS> 
</file> 

有多個「行」的節點,我想從這些節點中

我使用的XPath是內所有的代碼清單:

/file/ROWS/row/code 

與此代碼:

XmlDocument doc = new XmlDocument(); 
doc.Load(xml); 
XmlNode root = doc.DocumentElement; 
XmlNodeList nodeList = root.SelectNodes(xpath here); 
foreach (XmlNode code in nodeList) 
{ 
} 

但我沒有返回節點。

我在做什麼錯?

謝謝。

+1

請顯示一個簡短但完整的程序和XML文件,顯示該問題。通常,XPath問題是由命名空間問題引起的,我們可能在您的「修剪」版本中看不到這些問題。 –

+0

您的XPath表達式說''是文檔元素。實際上是這樣嗎? –

+0

您的'xpath'對我來說工作得很好。因此,我建議這是您的C#,但我無法幫助您。 – MattH

回答

0

解決方案和建議,如果您至少使用.net 3.5。

XDocument xdoc = XDocument.Load("XMLFile1.xml"); 
foreach (XElement element in xdoc.XPathSelectElements("//file/ROWS/row/code")) 
{ 

} 

一定要包含「using System.Xml.XPath;」

3

從代碼中刪除以下行:

root.InnerText = root.InnerText.ToLower(); 

這將創建小寫所有的標籤和您的XPath這是原來的標記名稱正確不再有效的XML。

+0

oops中添加了它,這不是問題,我嘗試這樣做,嘗試使用小寫的xpath (它仍然沒有工作)編輯 – Bex

+2

@Bex:這正是爲什麼一個簡短但完整的程序是有幫助的原因。這意味着每個人都在處理相同的代碼,刪除了愚蠢的小問題。 –

0

嘗試刪除從您這行代碼:

root.InnerText = root.InnerText.ToLower(); 

我試着將你的XPath爲小寫,離開這一行,但重置root.InnerText似乎破壞XML文檔的結構(通過步進調試器中的代碼在執行上述行後將root.ChildNodes.Count屬性從2更改爲1)。

0

你的查詢將工作,如果你有下一個XML結構:

<code> 
    <R>1</R> 
    <G>2</G> 
    <B>3</B> 
</code> 

其中,R,G,B的代碼子節點。

但在你的情況下,R,G,B以及代碼的行子節點:

<row> 
    <code> </code> 
    <R>1</R> 
    <G>2</G> 
    <B>3</B> 
</row> 

所以查詢file/ROWS/row/*[not(self::code)]將收集所有的R,G,B值(除代碼行的所有子節點) 。

並致電doc.SelectNodes(),而不是doc.DocumentElement.SelectNodes()