XPath与HTMLUnit/Groovy中给定元素的相对关系?
我想计算相对于给定表达式的XPath表达式 元素 我在这里读到: 下面的一个语法似乎不应该起作用 斜杠或后代: 然而,似乎没有一个在HTMLUnit中起作用。非常感谢任何帮助哦 这是一个groovy脚本,顺便说一句。谢谢 米沙XPath与HTMLUnit/Groovy中给定元素的相对关系?,xpath,groovy,htmlunit,Xpath,Groovy,Htmlunit,我想计算相对于给定表达式的XPath表达式 元素 我在这里读到: 下面的一个语法似乎不应该起作用 斜杠或后代: 然而,似乎没有一个在HTMLUnit中起作用。非常感谢任何帮助哦 这是一个groovy脚本,顺便说一句。谢谢 米沙 谢谢你 从问题的定义来看,尚不清楚XPath表达式是相对于哪个元素计算的。假设这是文档节点,则以下XPath表达式将选择所需的节点: */*/div[@class='levelone'] html/body/div[@class='levelone']
谢谢你 从问题的定义来看,尚不清楚XPath表达式是相对于哪个元素计算的。假设这是文档节点,则以下XPath表达式将选择所需的节点:
*/*/div[@class='levelone']
html/body/div[@class='levelone']
descendant::div[@class='levelone']
如果在未显示的实际XML文档中存在默认名称空间,则可能会出现问题。在这种情况下,您需要用XPath宿主语言(我不懂groovy)定义/注册此名称空间,并使用相关前缀,如下所示:
*/*/x:div[@class='levelone']
x:html/x:body/x:div[@class='levelone']
descendant::x:div[@class='levelone']
非常感谢你。显然,我的错误是在后代后面使用了一个分号,而不是两个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
啊
谢谢大家!
米沙
#!/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