1

XmlSlurperを使用していくつかのhtmlを解析しました。次に、指定された要素名を持つすべての子を繰り返し処理します。

私が今持っているのは、次のコードスニペットです

html.'**'.findAll { it.name() == 'a' }.each {
  println it
}

それは機能しますが、単にグルーヴィーではありません。こんな感じで書きたい

html.'**'.a.each {
  println it
}

このようにすると、GPathは「a」という名前のプロパティがないと文句を言います。この反復を定式化するための簡単な構文があるかどうか、何か考えはありますか?

4

2 に答える 2

3

残念ながら、Groovyには現在、要求していることを実行する方法がありません。
GPathResult(またはその子のいずれか)に対してこのような操作を実行する場合

html."**".a.b.c

行われるのは、「。」ごとのことです。GPathResult.getProperty()メソッドが呼び出されます。そして、このメソッドは、いくつかの有効な構文糖衣(*、**、..、および@)としてのみ使用されます。つまり、これらのいずれかを使用しない場合は、ターゲットとする各ノードにプロパティが実際に存在すると見なされます。

ツリーをトラバースするための条件付きヌルセーフ演算子が必要な場合は、GPathResultクラスに構文糖衣接頭辞(「?a」など)を追加するように要求します。たぶん、expandoメタクラスを使用してgetPropertyメソッドをオーバーライドすることでそれを達成できるかもしれませんが、私はそれを試しませんでした。

于 2010-09-22T09:03:35.317 に答える
1

再帰的クロージャを使用します。

def out = new StringBuffer()

def printNode
printNode = { o,node ->         
    o << '<' + node.name()
    node.attributes().each{ o << ' ' + it.key + '="' + it.value + '"' }
    o << '>'
    node.children().each{ printNode(out,it) }
    o << '</' + node.name() + '>'  
}

html.'**'.findAll { it.name() == 'a' }.each { printNode(out,it) }

println out.toString()
于 2013-03-10T19:56:39.027 に答える