個々の TextNode へのオブジェクト参照を取得することができます。おそらく、Jsoup のTextNodeオブジェクトを見過ごしていると思います。
Elementの最上位のテキストは、TextNode オブジェクトのインスタンスです。たとえば、" some text 1" と " some text 3" はどちらも "< div class='info' >" の下の TextNode オブジェクトであり、"Line 1:" は "< strong >" の下の TextNode オブジェクトです。
Element オブジェクトには、これらの TextNode オブジェクトを取得するために役立つ textNodes()メソッドがあります。
次のコードを確認してください。
String html = "<html>" +
"<body>" +
"<div class="info">" +
"<strong>Line 1:</strong> some text 1<br>" +
"<b>some text 2</b><br>" +
"<strong>Line 3:</strong> some text 3<br>" +
"</div>" +
"</body>" +
"</html>";
Document document = JSoup.parse(html);
Element infoDiv = document.select("div.info").first();
List<TextNode> infoDivTextNodes = infoDiv.textNodes();
このコードは、key="class" および value="info" の属性を持つ最初の < div > 要素を見つけます。次に、「< div class='info' >」直下のすべての TextNode オブジェクトへの参照を取得します。そのリストは次のようになります。
List<TextNode>[" some text 1", " some text 3"]
TextNode オブジェクトには、それらに関連付けられたいくつかの便利なデータとメソッドがあり、それらを利用できます。Node を拡張すると、利用できる機能がさらに増えます。
以下は、class="info" を使用して div 内の各 TextNode のオブジェクト参照を取得する例です。
for(Iterator<Element> elementIt = document.select("div.info").iterator(); elementIt.hasNext();){
Element element = elementIt.next();
for (Iterator<TextNode> textIt = element.textNodes().iterator(); textIt.hasNext();) {
TextNode textNode = textIt.next();
//Do your magic with textNode now.
//You can even reference it's parent via the inherited Node Object's
//method .parent();
}
}
このネストされたイテレータ手法を使用すると、オブジェクトのすべてのテキスト ノードにアクセスでき、巧妙なロジックを使用して、Jsoup の構造内で必要なことをほぼ実行できます。
私は過去に作成したスペル チェック メソッドにこのロジックを実装しましたが、多くの要素、おそらく多くのリストなどを含む非常に大きな html ドキュメントでパフォーマンスが低下します。ただし、ファイルの長さが妥当であれば、十分なパフォーマンスが得られるはずです。
以下は、Document の各 TextNode のオブジェクト参照を取得する例です。
Document document = Jsoup.parse(html);
for (Iterator<Element> elementIt = document.body().getAllElements().iterator(); elementIt.hasNext();) {
Element element = elementIt.next();
//Maybe some magic for each element..
for (Iterator<TextNode> textIt = element.textNodes().iterator(); textIt.hasNext();) {
TextNode textNode = textIt.next();
//Lots of magic here for each textNode..
}
}