2

xml 処理に groovy を使用しようとしていますが、その動作を理解するのはまだ難しいと感じています。次のプログラムが 1 と 0 を吐き出す理由を誰か説明してもらえますか? 「onenode」要素には子がないため、どちらの場合も 0 を期待しています...ここで何が欠けていますか?

def text = """
 <characters>
   <props>
      <prop>dd</prop>
   </props>
   <character id="1" name="Wallace">
       <likes>cheese</likes>
   </character>
   <character id="2" name="Gromit">
       <likes>sleep</likes>
   </character>
   <onenode>help</onenode>
</characters>
"""

def xmlp = new XmlParser().parseText(text)
println xmlp.onenode[0].children().size() // prints out 1

def xmls = new XmlSlurper().parseText(text)
println xmls.onenode[0].children().size() // prints out 0
4

1 に答える 1

1

違いは、解析されたツリーの構築方法(使用されるクラスとメソッドの動作の両方)です。

ツリーに問い合わせるためにクロージャーを作成する場合:

def dumpTypeTree = { node, prefix = '' ->
  def name  = node.respondsTo( 'name' ) ? "${node.name()} -- " : ''
  def clazz = node.getClass().name
  def txt   = node.respondsTo('text') ? node.text() : node
  println "${prefix}${name}${clazz} '${txt}'"
  if( node.respondsTo( 'children' ) ) {
    node.children().each { child ->
      owner.call( child, "$prefix  " )
    }
  }
}

XmlParser構築されたツリーでこのメソッドを呼び出すと、次のようになります。

dumpTypeTree( new XmlParser().parseText(text) )

我々が得る:

characters -- groovy.util.Node ''
  props -- groovy.util.Node ''
    prop -- groovy.util.Node 'dd'
      java.lang.String 'dd'
  character -- groovy.util.Node ''
    likes -- groovy.util.Node 'cheese'
      java.lang.String 'cheese'
  character -- groovy.util.Node ''
    likes -- groovy.util.Node 'sleep'
      java.lang.String 'sleep'
  onenode -- groovy.util.Node 'help'
    java.lang.String 'help'

ご覧のとおり、ノードにはそのノードのテキストコンテンツであるがonenode含まれています。Stringそして、text()呼び出しは私たちが期待するものを返します。

ただし、XmlSlurperで呼び出す:

dumpTypeTree( new XmlSlurper().parseText(text) )

私たちに与える:

characters -- groovy.util.slurpersupport.NodeChild 'ddcheesesleephelp'
  props -- groovy.util.slurpersupport.NodeChild 'dd'
    prop -- groovy.util.slurpersupport.NodeChild 'dd'
  character -- groovy.util.slurpersupport.NodeChild 'cheese'
    likes -- groovy.util.slurpersupport.NodeChild 'cheese'
  character -- groovy.util.slurpersupport.NodeChild 'sleep'
    likes -- groovy.util.slurpersupport.NodeChild 'sleep'
  onenode -- groovy.util.slurpersupport.NodeChild 'help'

ご覧のとおり、子はありません。葉の外側では、すべてのテキストが連結されているため、葉のノードをString呼び出すだけで意味があります。text()

とにかく、これが子供の数の違いを説明することを願っています

于 2012-11-13T10:23:25.920 に答える