2009-11-26 187 views
4

Mine是一個關於XML解析實踐的常見問題。用C#解析XML,XPath

假設我們有一個XML文件,我們使用XPath從那個文件的某個節點:

XMLNode node1=XMLDoc.SelectSingleNode("/SomeNode/SomeOtherNode"); 

現在N包含SomeOtherNode的數據。直覺上,我期望下面的代碼行:

XMLNode node2=XMLDoc.SelectSingleNode("/Child"); 

填充節點2與節點1的那些孩子們被命名爲「孩子」。但遺憾的是,這種方式並不奏效。 XPath搜索從文檔的根目錄開始,而不是從它被調用的XMLNode對象開始。有沒有什麼辦法讓它以「直觀」的方式工作?這對於遞歸或面向對象的解析方法來說是很方便的。

我試過使用XMLPathNavigator對象,但它的工作方式相同。看起來我可以將XMLDocumentFragment的內部文本設置爲給定節點的內部文本,但這似乎是數據的低效重複。

任何想法?

+0

如果您使用C#3或更高版本,請考慮使用LINQ to XML。請參閱http://msdn.microsoft.com/en-us/library/bb387098.aspx – TrueWill 2009-11-26 03:07:03

回答

8
XMLNode node2 = XMLDoc.SelectSingleNode("/Child"); 

這將選擇稱爲「少年」的元件從根(/)開始。請注意,您在node1上應用XMLDoc上的呼叫而不是,因此它將相對於文檔的根。我想你想要的是:

XMLNode node2 = node1.SelectSingleNode("Child"); // edit: removed slash 

這是相對於先前選擇的節點的XPath,而不是文檔根目錄。

或者,你可以這樣做:

XMLNode node = XMLDoc.SelectSingleNode("/SomeNode/SomeOtherNode/Child") 

這將直接選擇子節點。

+0

對不起,我在輸入中輸入錯誤。 node1.SelectSingleNode( 「/兒童」);是我試過的,它仍然看着文檔的根節點。 – Vercinegetorix 2009-11-26 02:42:03

+0

你的第二個例子不起作用:node1.SelectSingleNode(「/ Child」); node1具有對文檔根目錄的引用,並且當您使用開始斜槓進行選擇時,它將從文檔根目錄進行搜索。 要使其相對於節點1,您需要刪除斜線。 – dan 2009-11-26 03:13:09

+0

哎呀,對不起,斜線是我的一個錯字。 – 2009-11-26 10:05:37

0

我相信它應該是:

XMLNode node2=XMLDoc.SelectSingleNode(".//Child"); 

(注點)。

0

使用//而不是/將匹配給定名稱的所有節點。

/選擇從根節點

//選擇從符合選擇當前節點的文檔中的節點不管它們是