2

特定の要素がさまざまなコマンドを表す単純な「スクリプト」を表す xml ファイルがあります。

groovy を使用して xml ファイルを解析し、「解釈」したいと考えています。xml ファイルのノードを反復処理するにはどうすればよいですか。

xmlSlurper クラスを使用して xml ファイルを解析しています。

def records = new XmlSlurper().parse("./script.xml")

ここで、要素を上から下に繰り返し処理し、グルーヴィーなコードを実行する必要があります...

単なるサンプルファイル:

<script>  
<do> echo :) </do>  
<for from="0" to="3">
     <do> echo hello </do>
</for>
</script>
4

2 に答える 2

7

最善の方法は、Groovy XmlSlurper ユーザー ガイドを参照することです。このガイドには、いくつかの良い例があります。

たとえば、各子ノードを反復処理できます (<script>タグは除外されます)。

def visit(node) {
    node.childNodes().each { child ->
        println child.name
        visit(child)
    }
}

def records = new XmlSlurper().parse("./script.xml")
visit(records)

出力は次のようになります

do
for
do

このvisit関数は、クロージャーを取るように更新できます。

def visit(node, Closure c) {
    node.childNodes().each { child ->
        c(child)
        visit(child, c)
    }
}

def records = new XmlSlurper().parse("./script.xml")
visit(records) { node ->
    println node.name
}
于 2012-09-20T11:22:09.443 に答える
1

私の興味を引いたので、私はこれを思いついた:

class XmlRunner {
  def doFor( node ) {
    ((node.@from.text() as Integer)..(node.@to.text() as Integer)).each {
      run( node )
    }
  }

  def doDo( node ) {
    node.text().split().with {
      [it.head(), it.tail()]
    }.with { String cmd, rest ->
      "exec${cmd.capitalize()}"( rest )
    }
  }

  def execEcho( rest ) {
    println rest.join( ' ' )
  }

  def run( root ) {
    root.children().each {
      "do${it.name().capitalize()}"( it )
    }
  }

  static run( String xml ) {
    new XmlRunner().run( new XmlSlurper().parseText( xml ) )
  }

  static run( File xml ) {
    new XmlRunner().run( new XmlSlurper().parse( xml ) )
  }
}

XmlRunner.run( '''<script>  
                 |  <do> echo :) </do>  
                 |  <for from="0" to="3">
                 |    <do> echo hello </do>
                 |  </for>
                 |</script>'''.stripMargin() )

ただし、次の質問をする必要があります。

  1. Groovy スクリプトを実行してみませんか?
  2. XML でなければならない場合、echo が独自のノードを取得しないのはなぜですか?
  3. forノードには変数が必要ですか?

これを次のような Groovy スクリプトに変更します。

println ':)'
4.times { println 'hello' }

そして、独自の XML 言語を定義しようとするのではなく、Groovy から通常の方法で実行します (独自の XML 言語を作成できないという本当に正当な理由がある場合を除きます)。

于 2012-09-20T13:50:12.397 に答える