提取下拉列表中的单个文本

时间:2017-08-23 21:02:51

标签: jsoup

是否可以使用选择器选择下拉列表中可用的单个文本?
类似的东西:

 p > w|Sdt  > w|ListItem (with text value following)

从这个用例我想得到“这是一个Value1”

<p>
&nbsp; <w:Sdt DropDown="t" id="-537820932">
        <w:ListItem ListValue="SELECT ONE" DataValue="SELECT ONE"/>
        <w:ListItem ListValue="test1" DataValue="test1"/>
        <w:ListItem ListValue="test2" DataValue="test2"/>Here is a Value1
        <w:ListItem ListValue="test3" DataValue="test3"/>
        <w:ListItem ListValue="test4" DataValue="test4"/>
        </w:Sdt>
    <o:p/>
</p>

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用Node.nextSibling()方法。我已经根据您的HTML创建了一个示例,只添加了一个小例子 - 我添加了另一个文本,向您展示在这种情况下您必须考虑的内容。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Node;

import java.util.Set;
import java.util.stream.Collectors;

final class Example {

    public static void main(String[] args) {
        String html = "<p>\n" +
                "&nbsp; <w:Sdt DropDown=\"t\" id=\"-537820932\">\n" +
                "        <w:ListItem ListValue=\"SELECT ONE\" DataValue=\"SELECT ONE\"/>\n" +
                "        <w:ListItem ListValue=\"test1\" DataValue=\"test1\"/>\n" +
                "        <w:ListItem ListValue=\"test2\" DataValue=\"test2\"/>Here is a Value1\n" +
                "        <w:ListItem ListValue=\"test3\" DataValue=\"test3\"/>\n" +
                "        <w:ListItem ListValue=\"test4\" DataValue=\"test4\"/>Test\n" +
                "        </w:Sdt>\n" +
                "    <o:p/>\n" +
                "</p>";

        Document doc = Jsoup.parse(html);

        Set<String> texts = doc.select("p > w|Sdt > w|ListItem")
                .stream()
                .map(Node::nextSibling)
                .map(Node::toString)
                .map(String::trim)
                .filter(el -> !el.isEmpty())
                .collect(Collectors.toSet());

        System.out.println(texts);
    }
}

正如您所看到的,我们从p > w|Sdt > w|ListItem选择器开始,它将捕获所有列表项。接下来,我们选择所有元素的下一个兄弟,采用它们的文本表示并过滤掉所有空值,因为在它们旁边没有任何文本的列表元素将返回空字符串。最后我们将所有值收集到一组中。运行此示例将生成输出:

[Test, Here is a Value1]

如果您的案例保证列表项旁边只有单个文字,那么您可以使用.collect(Collectors.toSet())更改.findFirst().orElse(null)

您可以在这里查看 Demo