2010-06-05 3 views
3

Я хотел бы оценить выражение XPath relative для данного элемента .XPath _relative_ для заданного элемента в HTMLUnit/Groovy?

Я читал здесь: http://www.w3schools.com/xpath/default.asp

И это, кажется, как один из приведенных ниже синтаксисов должен работать (ЭСП не ведущий или слэш потомка :)

Однако никто не похоже на работу в HtmlUnit. Любая помощь очень ценится (oh это отличный скрипт). Спасибо!

http://htmlunit.sourceforge.net/

http://groovy.codehaus.org/

Миша


#!/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 

Спасибо !!!

ответ

2

Непонятно из определения проблемы, каков элемент, по отношению к которому оцениваются выражения XPath. Если предположить, что это узел документа, то следующие выражения XPath будет выбрать нужный узел:

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

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

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

Вы можете иметь проблемы, если в самом документе XML (не показан), имеется пространство имен по умолчанию. В этом случае вам нужно определить/зарегистрировать это пространство имен в вашем XPath-хостинга языка (я не знаю, заводной) и использовать соответствующий префикс, например:

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

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

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

Спасибо так много. Видимо, моя ошибка была с помощью одной запятой после потомка, а не два (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!

Спасибо!

Misha