2010-02-24 159 views
4

我使用XOM與下面的示例數據:XPath表達式返回沒有爲//元素,但// *返回計數

Element root = cleanDoc.getRootElement(); 
//find all the bold elements, as those mark institution and clinic. 
Nodes nodes = root.query("//*"); 

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:html="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>Patient Information</title> 
    </head> 
</html> 

以下元素返回許多元素(根據實際數據):

//* 

但像

//head 

返回無中生有。如果我跑過根的孩子,這些數字似乎相匹配,並且如果我打印元素名稱,一切看起來都是正確的。

我正在使用HTML,使用tagsoup解析它,然後從生成的字符串構建一個XOM文檔。這其中的哪一部分可能會出現如此可怕的錯誤?我覺得這裏有一些奇怪的編碼問題,但我只是沒有看到它。 Java字符串是字符串,對不對?

+0

我想你想要什麼(//頭帶ns聲明)可以使用vtd-xml – 2010-02-24 06:07:09

回答

6

您的文檔具有默認名稱空間,這意味着在XPath模型中所有元素都在該名稱空間中。查詢應該是//html:head。您將不得不提供命名空間映射到XPath查詢。

請注意,儘管XPath表達式使用名稱空間前綴,但它是必須匹配的名稱空間URI。

XPathContext ctx = new XPathContext("html", "http://www.w3.org/1999/xhtml"); 
Nodes nodes = root.query("//html:head", ctx); 
+0

啊,我明白了。我過去使用的所有文檔都是完全沒有名稱空間的,所以我以前沒有打過。謝謝。 – 2010-02-24 03:38:28