2011-01-24 7 views
0

を見つけたことはありません2番目のシナリオでtextを取得する方法を理解します。私はいくつかの方法を試みたが、ここで私は以下の動作するはずと思ったものだしました:XmlSlurperは、私は、ページ窮地に次のようになり、いくつかのDOMをしようとしているノード

def html = slurper.parse(reader) 
Collection<NodeChild> nodes = html.'**'.findAll { it.name() == 'span' && [email protected] == 'style2' } 
... 
def descriptionNode = html.'**'.find { it.name() == 'span' && [email protected] == 'style20' } 
def innerNode = descriptionNode.'**'.find { it.name() == 'p' } 
def description 
if (innerNode?.size() > 0) 
{ 
description = innerNode.text() 
} 
else 
{ 
description = descriptionNode.text() 
} 

私は私が必要とする動作を取得するためにxmlslurperを使用して行く必要があるどのように任意のアイデアを?

答えて

0

このHTMLは無効である必要があります。 Tagsoupは

<div> 
<span> 
</span> 
<p></p> 
</div> 

を作成したが、Firebugのは

<div> 
<span> 
<p></p> 
</span> 
</div> 

ひどい何のバグを表示します。

0

xpath://span/text()を試してみましたか? タグ付けされたpについては、2回クエリする必要があります。

3

spanにネストされたpが含まれているかどうかを確認したいと思うようです。ノードの子であるspanを反復処理して、そのケースをチェックすることができます。例:

def xml = """ 
<test> 
    <span>test1</span> 
    <span><p>test2</p></span> 
    <other><span>test3</span></other> 
    <other><span><p>test4</p></span></other> 
</test> 
""" 

def doc = new XmlSlurper().parseText(xml) 
def descriptions = [] 
doc.'**'.findAll { it.name() == 'span' }.each { node -> 
    if (node.children().find { it.name() == 'p' }) { 
      descriptions << node.p.text() 
    } else { 
      descriptions << node.text() 
    } 
} 
assert descriptions == ['test1', 'test2', 'test3', 'test4'] 
関連する問題