2010-08-06 53 views
9

我想學習XPath。這個理論看起來非常簡單,除非它不起作用。使用XPATH訪問XML元素(是:很好的學習xpath的教程)

我試圖讓每一個目標元素

XPathDocument doc = new XPathDocument(sPath); 
XPathNavigator nav = doc.CreateNavigator(); 
XPathExpression expr; 
expr = nav.Compile("/doc/file/body/trans-unit/target"); 
XPathNodeIterator iterator = nav.Select(expr); 

while (iterator.MoveNext()) 
{ 
    XPathNavigator nav2 = iterator.Current.Clone(); 
    sbDoc.Append(nav2.InnerXml); 
} 

的XML文檔看起來像這樣的內容:

<?xml version="1.0" encoding="UTF-8"?> 
<doc version="1.2"> 
    <file original="affiliate.php" source-language="EN-US" target-language="FR-FR" datatype="php"> 
    <header> 
     <skl> 
     <external-file href="affiliate.php"/> 
     </skl> 
    </header> 
    <body> 
     <trans-unit id="tu1"> 
     <source xml:lang="EN-US">Your Program Details</source> 
     <target xml:lang="FR-FR">Your Program Details</target> 
     </trans-unit> 
     <trans-unit id="tu2"> 
     <source xml:lang="EN-US">Status</source> 
     <target xml:lang="FR-FR">Status</target> 
     </trans-unit> 

這是近詞從一個教程的詞,但我可以」讓它工作。在創建迭代器時,在調試模式下,我可以看到文檔已加載,但迭代器找不到結果並跳過While循環。

我可能在做一些非常愚蠢的事情,但是什麼?

任何人都知道我在哪裏可以找到一個好的,可靠的XPATH教程?


謝謝大家。原來我忽略了這樣一個事實,即有一個命名空間(我在簡化XML代碼時刪除了這個命名空間,因爲我沒有意識到它很重要),並且增加了一個命名空間管理器,代碼工作正常。

我現在正在研究提出的XPATH教程,它們看起來不錯。

回答

8

也許XML不是您發佈的XML,而是具有默認名稱空間聲明。這是初學者編寫的XPath表達式不選擇他們想要選擇的主要原因。在這種情況下,您需要一個XmlNamespaceManager http://msdn.microsoft.com/en-us/library/6k4x060d.aspx

+0

謝謝馬丁。你是對的,我在「簡化」XML文件時刪除了原來的一個命名空間,當然,現在它起作用了。 – Sylverdrag 2010-08-06 15:48:00

+1

@Sylverdrag:以及這個答案如何提供您的問題標題**「學習xpath的好教程」**。我認爲你應該編輯它。 – 2010-08-06 20:44:27

+0

@Alejandro:這是一個2合1的問題,我必須把它交給設法發現潛在問題的人,儘管我確實讚揚了好的教程答案。 – Sylverdrag 2010-08-07 02:28:36

9

我會去的經典W3Schools tutorial。這就是我學習的方式,它讓我感覺很好。絕對涵蓋了所有的基礎知識。

+0

+1你的速度太快;) – 2010-08-06 13:00:49

+0

看起來像一個很棒的教程。謝謝! Jag! – Sylverdrag 2010-08-06 16:04:13

3

我一直覺得這個教程/參考是非常有用的... http://zvon.org/comp/r/tut-XPath_1.html#

UPDATE
我用你的代碼和XML文檔,並能檢索沒有問題的目標元素。我確實必須在XML文檔的末尾關閉<body>, <file> and <doc>元素,但我認爲這是剪切和粘貼問題。我想我的問題是(並且這太明顯了),您確定XML文檔正在加載,並且加載的文檔實際上包含您要去的內容?我複製了你的XML文檔並在XPathDocument構造函數中對路徑進行了硬編碼,並且一切正常(表示StringBuilder具有來自<target>元素的文本)。

也試過ANSI和UTF-8編碼 - 沒有問題。

我使用VS2010作爲我的開發環境。

1

JQuery支持基本的XPath表達式,您可以使用它來練習編寫XPath選擇器。

+0

Ja! JA!我們總是看到有關javascript(甚至關於CSS)的技術問題的答案,建議使用像JQuery這樣的庫。但我從來沒有見過它作爲教程推薦! – 2010-08-06 14:27:17

+0

@Alejandro:P .. – satoru 2010-08-06 14:39:23

2

,我遲到了,但會張貼者。

獲取XPathbuilder。如果您希望學習xpath,請讓自己獲得這個工具,一個扭曲的xml文件示例,打開xpath中的幫助部分,並給它一個提示。

我現在正在使用它,我不能相信它花了我5分鐘來選擇我需要的東西。 (夢魘配置文件爲xml)。