2017-08-23 7 views
1

セレクタを使用してドロップダウンリストで利用可能な単一のテキストを選択できますか?以下のような
何か:私は取得したいと思い、このユースケースからドロップダウンで利用可能な単一のテキストを抽出します

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

あなたがNode.nextSibling()メソッドを利用することができます。この場合

<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

「ここには値1です」。あなたの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セレクタから開始します。次に、すべての要素の次の兄弟を選択し、それらのテキスト表現を取り、すべての空の値をフィルタリングします。なぜなら、リスト要素の隣にテキストがなくなると、空の文字列が返されるからです。そして、結局、すべての値を集合に集めます。あなたの場合は、次のリストの項目に、あなたは.findFirst().orElse(null).collect(Collectors.toSet())を変更することができ、単一のテキストがあることを保証した場合

[Test, Here is a Value1] 

:この例を実行すると、出力を生成します。ここで

あなたが生きてチェックすることができDemo

+0

これは素晴らしいですが、あなたはセレクタ式と同じ溶液を得ることが可能であると思いますか? 例:p> w | Sdt> w | ListItem - > nextは空ではありませんか? – user648026

+0

@ user648026そうは思わない。少なくとも私はそれを単一のセレクタ式を使用して動作させることができませんでした。主な問題は、抽出しようとしているテキストがHTMLタグの外にあることです。これと同等のものは 'p> w | Sdt> w | ListItem + *:matchesOwn(。+)'のようなものになります。 –

関連する問題