2011-03-13 94 views
1

我有firexpath,它似​​乎沒有與xpath一起工作。即使簡單的//div也沒有結果。即使我點擊現有節點,說「複製XPath」,然後將該XPath粘貼到過濾器輸入框中,它會顯示「找不到節點」。 //*[name()='div']雖然工作。我是否缺少命名空間或其他東西?下面是根標籤的樣子(這是一個有效的XHTML):xpath使用firexpath

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" class="ff ff3"> 

我沒有找到FireXPath一個支持論壇,所以我在這裏張貼。

+0

好問題,+1。請參閱我的回答以獲得解釋和三種替代解決方案。 :) – 2011-03-13 02:24:21

+0

[XPath的許多可能的重複之一是用defaultNamespace爲xml返回null](http://stackoverflow.com/questions/4380006/xpath-is-returning-null-for-xml-with-defaultnamespace) – 2011-03-13 21:04:56

+0

參考特別是firepath使得它獨一無二,因爲firepath中的名稱空間註冊似乎不存在。 – zode64 2011-03-14 14:58:52

回答

0

我沒有使用firexpath,但它看起來好像默認命名空間xmlns="http://www.w3.org/1999/xhtml"阻止xpath發現div作爲元素內部的div元素,該元素無法使用該名稱空間加前綴xmlns。

因此,您需要使用某種方法調用註冊名稱空間與firexpath?然後//div應該工作或你的表情也很有效,如果你想考慮在表達命名空間,您可以包括像這樣

//*[name()='div' and namespace-uri()='http://www.w3.org/1999/xhtml'] 

編輯命名空間的檢查:

我已經下載firexpath這現在被稱爲firepath,它看起來不可能註冊一個命名空間,所以它看起來像你將不得不的名稱()方法

0

如果你不能註冊名稱空間(對於默認命名空間),然後前綴每個元素名稱與註冊前綴的XPath表達式中,然後您可以使用XPath表達式是這樣的:

/*[name()='x']/*[name()='y']/*[name()='z'] 

的情況下有屬於其他名稱空間(而不是默認命名空間),你必須使用一個更具體的XPath表達式元素:

/*[name()='x' and namespace-uri()='http://www.w3.org/1999/xhtml'] 
     /*[name()='y' and namespace-uri()='http://www.w3.org/1999/xhtml'] 
      /*[name()='z' and namespace-uri()='http://www.w3.org/1999/xhtml'] 

如果你能已註冊默認名稱空間和前綴是(說)「p」,那麼上述將等於現在更簡單的表達式:

/p:x/p:y/p:z