2016-10-24 107 views
1

假设我正在寻找两个兄弟节点AB。他们将满足选择器如何通过jsoup获取元素对?

root.select("A ~ B") 

并且该选择器将返回所有这样的B s。

但是如果我需要所有这样的东西A/B?我目前正在执行以下操作:

root.select("A").stream() 
     .filter(a -> a.parent() != null) 
     .forEach(a -> { 
      Element b = a.parent().select("B:gt(" + a.elementSiblingIndex() + ")").first(); 
      if (b != null) { 
       // do something with a and b 
      } 
     }); 

这大约是正确的习惯用法吗? a.parent().select()似乎笨重,但我找不到一个更简单的方法来做到这一点。

+0

我有麻烦可视化这一点,你可以发布完整的HTML片段,你正在试图获得该元素的? –

+0

我试图重写这个问题,使其更清晰。对于那个很抱歉。 – dkarp

+0

此外,我需要我的第二个'选择'是'“:root> B:gt(”+ a.elementSiblingIndex()+“)”'? – dkarp

回答

0

我不认为你的方法有什么问题。如果你不希望使用a.parent().select()你可以得到与siblingElements()相同的结果:

root.select("A~B").stream().forEach(b -> { 
    List<Element> siblings = b.siblingElements().subList(0, b.elementSiblingIndex()); 
    Collections.reverse(siblings); 
    for (Element a : siblings) { 
     if(a.nodeName().equals(B)) break; 
     if(a.nodeName().equals(A)){ 
      // do something with a and b 
     } 
    } 
});