如果我有一个看起来像这样的元素:
<foo>
<bar> bar text 1 </bar>
<baz>
<bar> bar text 2 </bar>
</baz>
</foo>
Run Code Online (Sandbox Code Playgroud)
而且我已经<foo>选择了元素,并且我想选择<bar>直接子元素<foo>但不是子元素的元素<baz>,如何指定?
Element foo = <that thing above>
foo.select("bar").text();
Run Code Online (Sandbox Code Playgroud)
产量 "bar text 1 bar text 2"
我想要的是类似的东西
foo.select("this > bar").text();
Run Code Online (Sandbox Code Playgroud)
问题是:如何在选择器中指定"this element"?
请注意,所需的bar可能不是第一个 - 我需要一个适用于以下方面的解决方案:
<foo>
<baz>
<bar> bar text 2 </bar>
</baz>
<bar> bar text 1 </bar>
</foo>
Run Code Online (Sandbox Code Playgroud)
使用:root结构伪元素指定"此元素".从Element.selectJavadoc中,我们看到select使用"this element作为起始上下文"并且可以匹配"this element,或者它的任何子元素"; 也就是说,:root指的是这个元素,而不是实际的文档根.通过将第二个示例放在一些外部标记中来演示以下代码:
//nest your second sample in some fake outer html body
Element html = (Element)Parser.parseFragment("<html><body><foo>\n" +
" <baz>\n" +
" <bar> bar text 2 </bar>\n" +
" </baz>\n" +
" <bar> bar text 1 </bar>\n" +
"</foo></body></html>", null, "http://example.com").get(0);
Element foo = html.select("foo").first();
System.out.println(foo.select(":root > bar"));
Run Code Online (Sandbox Code Playgroud)
此代码打印
<bar>
bar text 1
</bar>
Run Code Online (Sandbox Code Playgroud)
正确地跳过嵌套bar元素.
根据Jsoup更改日志,1.7.2中添加了结构伪元素支持.