如何在JSoup中选择"this element"的直接子项

Pur*_*ont 9 jsoup

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

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

Jef*_*oom 8

使用: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中添加了结构伪元素支持.