2011-07-14 76 views
6

我有一個網站結構看起來是這樣的:HtmlUnit 2.8 getFirstByXPath不同於HtmlUnit 1.14 getFirstByXPath?

<div class='main_container'> 
    <div class='item_container'> 
     <div class='body'> 
      <span class='item_name'>Item 1</span> 
      <span class='item_desc'>Desc 1</span> 
     </div> 
    </div> 
    <div class='item_container'> 
     <div class='body'> 
      <span class='item_name'>Item 2</span> 
      <span class='item_desc'>Desc 2</span> 
     </div> 
    </div> 
    ... 
</div><!--End of main_container--> 
//Note: Some divs might not have <span @class='item_name'>Item N</span> or other elements inside the item_container 

在的HtmlUnit 1.14,如果我要得到所有項目名稱:

List<HtmlDivision> divs = (List<HtmlDivision>)page.getByXPath("//div[@class='item_container']"); 
for(HtmlDivision div:divs){ 
    String name = ((HtmlElement)div.getFirstByXPath("//span[@class='item_name']")).asText(); 
    System.out.println(name); 
} 

輸出:

Item 1 
Item 2 
... 

但在HtmlUnit 2.8當我做同樣的我得到。

Item 1 
Item 1 
... 

在HtmlUnit 2.8中有這個解決方法嗎?

回答

6

這可能是HtmlUnit 1.4有一個你正在利用/依賴的錯誤。

在你表現出的for循環應該在每次執行(因爲它在V2.8)時間返回相同的元素內的XPath的代碼,因爲它開始與//,看起來通過entiredocument從根節點開始並返回第一個它找到。

如果你希望它是從循環中<div>相對的,你應該調整你的XPath:.//span[@class='item_name']

+0

的JavaDoc的方法說,「從這個節點計算指定的XPath表達式,返回第一個匹配的元素,如果沒有節點匹配指定的XPath表達式,則返回null。「那麼它不應該在調用此方法的節點內搜索元素嗎? – Viraj