可以获得对单个 TextNode 的对象引用。我想也许你看过 Jsoup 的TextNode对象。
Element顶层的文本是 TextNode 对象的一个实例。例如,“some text 1”和“some text 3”都是“<div class='info'>”下的TextNode对象,“Line 1:”是“<strong>”下的TextNode对象
元素对象有一个textNodes()方法,可用于获取这些 TextNode 对象。
检查以下代码:
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();
此代码查找第一个 <div> 元素,该元素具有 key="class" 和 value="info" 的属性。然后直接在“<div class='info'>”下获取对所有 TextNode 对象的引用。该列表如下所示:
List<TextNode>[" some text 1", " some text 3"]
TextNode 对象有一些与它们相关联的甜蜜数据和方法,您可以使用它们,并且扩展Node为您提供更多可以使用的功能。
以下是获取 div 中每个 TextNode 的对象引用的示例,其中 class="info"。
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..
}
}