如果我有一个看起来像这样的元素:
<foo>
<bar> bar text 1 </bar>
<baz>
<bar> bar text 2 </bar>
</baz>
</foo>
我已经选择了<foo>
元素,并且我想选择<bar>
元素,它是<foo>
的直接子元素,而不是<baz>
的子元素1}},如何指定?
Element foo = <that thing above>
foo.select("bar").text();
收益"bar text 1 bar text 2"
我想要的是像
foo.select("this > bar").text();
问题是:如何在选择器中指定&#34;此元素&#34; ?
请注意,所需的bar
可能不是第一个 - 我需要一个适合的解决方案:
<foo>
<baz>
<bar> bar text 2 </bar>
</baz>
<bar> bar text 1 </bar>
</foo>
答案 0 :(得分:8)
使用:root
结构伪元素指定&#34;此元素&#34;。从Element.select
Javadoc开始,我们看到select
使用&#34;此元素作为起始上下文&#34;并且可以匹配&#34;此元素或其任何子元素#34 ;;也就是说,: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"));
此代码打印
<bar>
bar text 1
</bar>
正确跳过嵌套的bar
元素。
根据Jsoup changelog,在1.7.2中添加了结构伪元素支持。
答案 1 :(得分:3)
我相信你想要:
foo.select("> bar").text();
请参阅jsoup Selectors页面,Combinators
部分:
E > F an F direct child of E