Jsoup - 我怎样才能让直接孩子使用Jsoup而不是子孙?

时间:2014-07-23 22:37:58

标签: groovy jsoup

XML如下,我只关心<a><b></b></a>的第一级,请注意:在子节点<d></d>中,也有相同的节点。这是个问题。

<a>
    <b>b1</b>
    <b>b2</b>
    <d>
        <a>
            <b>d_a_b1</b>
        </a>
        <a>
            <b>d_a_b2</b>
        </a>
    </d>
    <c>c</c>
</a>

我只想获得&gt;的价值b,所以我使用了Jsoup选择器来选择,以下是代码:

def str2 = '''
<a>
    <b>b1</b>
    <b>b2</b>
    <d>
        <a>
            <b>d_a_b1</b>
        </a>
        <a>
            <b>d_a_b2</b>
        </a>
    </d>
    <c>c</c>
</a>'''

Document doc = Jsoup.parse(str2)
doc.select("a > b").each {
    println it.text()
}

但结果是选择器还在<d> </d>节点下找到了节点,这不是我所关心的..我想得到的结果是:

b1
b2

,实际结果是:

b1
b2
d_a_b1
d_a_b2

任何人都可以帮助选择第一级节点吗?任何评论都非常感谢!

1 个答案:

答案 0 :(得分:1)

我不熟悉groovy,但你可以选择像这样的第一级孩子

Document doc = Jsoup.parse(s)

Element a = doc.select("a").first()
System.out.println(doc)
Elements aChildren = a.children()

for(Element element : aChildren) {
    println element.select("b").text()
}

但我认为你的例子还有另一个问题。 Jsoup会像这样解析你的XML:

<html>
 <head></head>
 <body>
  <a> <b>b1</b> <b>b2</b> 
   <d> 
   </d></a>
  <a> <b>d_a_b1</b> </a> 
  <a> <b>d_a_b2</b> </a>  
  <c>
   c
  </c> 
 </body>
</html>

正如您可以看到标记<a>后面的</d>标记已关闭。这是因为HTML中不存在嵌套的<a>(它将意味着不符合逻辑的嵌套链接),JSoup将为您修复它。

我希望这会有所帮助。正如我所说,我不熟悉groovy。所以我可能会犯一些语法或逻辑错误。