如何选择"这个元素的直接孩子"在JSoup中

时间:2015-04-28 21:13:10

标签: jsoup

如果我有一个看起来像这样的元素:

<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>

2 个答案:

答案 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