tag
结构如下:
<div class="some-class">
<h3>Foo</h3>
<p>...</p>
<p>...</p>
<h3>Bar</h3>
<p>...</p>
<p>...</p>
...
现在,我想在找到some-class
标记后删除h3
代码中的所有元素。 nextAll()
中的JSoup
方法是否与JavaScript
类似?
现在我有
for (Element el : doc.select("div") {
if (el.className().equalsIgnoreCase("some-class") {
for (Element e : el.select("h3") {
if (e.hasText().equalsIgnoreCase("Bar") {
removeAllNextPTags();
}
}
}
}
有什么想法吗?
答案 0 :(得分:1)
JSoup中是否有nextAll()方法
您可以在基于元素的基础上使用nextElementSibling()
,或在基于节点的基础上使用nextElementSibling()
。
我不完全确定我是否理解你是正确的,但你想在h3之后删除所有元素或只是p元素(直到另一个h3发生!?)?
以下是如何删除所有p元素,从具有给定文本的h3元素开始 - 直到找到另一个h3:
public void removeChilds(Element root, String h3Text)
{
final Element h3Start = root.select("h3:contains(" + h3Text + ")").first();
final int h3Idx = h3Start.siblingIndex();
for( Element e : h3Start.siblingElements() )
{
// Skip all nodes before the relevant h3 element
if( e.siblingIndex() > h3Idx )
{
switch(e.tagName())
{
case "p":
e.remove();
break;
case "h3":
/* Stop if there's a h3 */
return;
default:
/* Stop also if there's any non-p element!? */
return;
}
}
}
}
为所有具有给定文本的h3执行此操作 - 例如。多个<h3>Foo</h3>
- 包含子项的元素 - 您可以将first()
替换为找到的元素(即select()
返回的内容)。