2010-06-05 4 views
3

Je voudrais évaluer une expression XPath relative à un élément donné .XPath _relative_ à un élément donné dans HTMLUnit/Groovy?

Je lis ici: http://www.w3schools.com/xpath/default.asp

Et il semble que l'une des syntaxes ci-dessous devrait fonctionner (en particulier pas leader slash ou descendant :)

Cependant, aucun ne semble fonctionner dans HTMLUnit. Toute aide très appréciée (oh c'est un script groovy btw). Je vous remercie!

http://htmlunit.sourceforge.net/

http://groovy.codehaus.org/

Misha


#!/usr/bin/env groovy 

import com.gargoylesoftware.htmlunit.WebClient 

def html=""" 
<html><head><title>Test</title></head> 
<body> 
<div class='levelone'> 
<div class='leveltwo'> 
    <div class='levelthree' /> 
</div> 
<div class='leveltwo'> 
    <div class='levelthree' /> 
    <div class='levelthree' /> 
</div> 
</div> 

</body> 
</html> 
""" 

def f=new File('/tmp/test.html') 
if (f.exists()) { 
f.delete() 
} 
def fos=new FileOutputStream(f) 
fos<<html 

def webClient=new WebClient() 
def page=webClient.getPage('file:///tmp/test.html') 

def element=page.getByXPath("//div[@class='levelone']") 
assert element.size()==1 
element=page.getByXPath("div[@class='levelone']") 
assert element.size()==0 
element=page.getByXPath("/div[@class='levelone']") 
assert element.size()==0 
element=page.getByXPath("descendant:div[@class='levelone']") // this 
gives namespace error 
assert element.size()==0 

Merci !!!

Répondre

2

La définition du problème ne permet pas de déterminer quel est l'élément relatif à l'évaluation des expressions XPath. Si l'on suppose que c'est le nœud de document, les expressions XPath suivantes sélectionner le nœud souhaité:

*/*/div[@class='levelone'] 

    html/body/div[@class='levelone'] 

    descendant::div[@class='levelone'] 

Vous avez sans doute problème si dans le document XML réel (non représenté), il y a un espace de noms par défaut. Dans ce cas, vous devez définir/enregistrer cet espace de noms dans votre langue XPath-hébergement (je ne sais pas groovy) et utiliser le préfixe associé, comme ceci:

*/*/x:div[@class='levelone'] 

    x:html/x:body/x:div[@class='levelone'] 

    descendant::x:div[@class='levelone'] 
0

Merci beaucoup. Apparemment mon erreur était en utilisant un seul point-virgule après descendant plutôt que deux (doh)

#!/usr/bin/env groovy 

import com.gargoylesoftware.htmlunit.WebClient 

def html=""" 
<html><head><title>Test</title></head> 
<body> 
<div class='levelone'> 
    <div class='leveltwo'> 
    <div class='levelthree' /> 
    </div> 
    <div class='leveltwo'> 
    <div class='levelthree' /> 
    <div class='levelthree' /> 
    </div> 
</div> 

</body> 
</html> 
""" 

def f=new File('/tmp/test.html') 
if (f.exists()) { 
    f.delete() 
} 
def fos=new FileOutputStream(f) 
fos<<html 

def webClient=new WebClient() 
def page=webClient.getPage('file:///tmp/test.html') 

def element=page.getByXPath("//div[@class='levelone']") 
assert element.size()==1 
element=page.getByXPath("div[@class='levelone']") 
assert element.size()==0 
element=page.getByXPath("/div[@class='levelone']") 
assert element.size()==0 
element=page.getByXPath("descendant::div[@class='levelone']") 
assert element.size()==1 

Doh!

Merci!

Misha

Questions connexes