是否可以使用选择器选择下拉列表中可用的单个文本?
类似的东西:
p > w|Sdt > w|ListItem (with text value following)
从这个用例我想得到“这是一个Value1”
<p>
<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>
答案 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" +
" <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