Как выбрать прямой дочерний элемент "этого элемента" в JSoup

если у меня есть элемент, который выглядит так:

<foo>
    <bar> bar text 1 </bar>
    <baz>
        <bar> bar text 2 </bar>
    </baz>
</foo>

и у меня уже есть <foo> элемент выбран, и я хочу, чтобы выбрать <bar> элемент, который является прямым потомком <foo> но не тот, который является ребенком <baz> как мне указать это?

Element foo = <that thing above>
foo.select("bar").text();

доходность "bar text 1 bar text 2"

что я хочу, это что-то вроде

foo.select("this > bar").text();

вопрос: как указать "этот элемент"!--21--> в селектор?

обратите внимание, что нужные bar может быть, не первый - мне нужно решение, которое также будет работать для:

<foo>
    <baz>
        <bar> bar text 2 </bar>
    </baz>
    <bar> bar text 1 </bar>
</foo>

2 ответов


использовать :root структурный псевдоэлемент, чтобы указать "этот элемент". От Element.select Javadoc, мы видим select использует " этот элемент в качестве начального контекста "и может соответствовать" этому элементу или любому из его дочерних элементов"; то есть :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, структурная поддержка псевдо-элемента была добавлена в 1.7.2.


Я считаю, что вы хотите:

foo.select("> bar").text();

см. jsoup селекторы страницы :

E > F     an F direct child of E