2011-07-14 16 views
6

que tienen una estructura de sitio que se ve algo como esto:¿Es HtmlUnit 2.8 getFirstByXPath diferente de 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 

En HtmlUnit 1.14 si quiero conseguir todo nombre del artículo:

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); 
} 

Salida:

Item 1 
Item 2 
... 

Pero en HtmlUnit 2.8 cuando hago lo mismo que tengo.

Item 1 
Item 1 
... 

¿Hay alguna solución a esto en HtmlUnit 2.8?

Respuesta

6

Es posible que HtmlUnit 1.4 tenga un error que explotabas/confiabas.

En el código que usted mostró, el XPath en el interior de la for bucle debe devolver el mismo elemento cada vez que se ejecuta (como lo hace en v2.8), ya que se inicia con //, que se ve a través de la entiredocument comenzando en el nodo raíz y devuelve el primero que encuentra.

Si quieren que sea relativa desde el <div> en el circuito, tiene que ajustar su XPath para: .//span[@class='item_name']

+0

Javadoc para el método dice "evalúa la expresión XPath especificado desde este nodo, volviendo el primer elemento coincidente, o nulo si ningún nodo coincide con la expresión XPath especificada ". Entonces, ¿no debería buscar elementos dentro del nodo en el que se llama este método? – Viraj

Cuestiones relacionadas