1

プロパティを持つフィールドのコレクションがあります。各プロパティは、単一の値またはオブジェクトのコレクション(null、1つ、または多数)です。

そのためにxmlのようなツリーを作成する必要があります。

これまでに見つけたすべての例は、静的であるか、マップをxmlに変換します。サイクルでxmlにノードを追加する適切な方法は何ですか?

4

1 に答える 1

1

あなたはこの種のことをすることができます、しかしあなたの入力の例と望ましい出力がなければ、それはすべてただ盲目的な推測です:

import groovy.xml.*

def collection = [
  [ name:'tim', pets:['cat','dog'], age:null ],
  [ name:'brenda', pets:null, age:32 ]
]

def process = { binding, element, name ->
  if( element[ name ] instanceof Collection ) {
    element[ name ].each { n ->
      binding."$name"( n )
    }
  }
  else if( element[ name ] ) {
    binding."$name"( element[ name ] )
  }
}

println XmlUtil.serialize( new StreamingMarkupBuilder().with { builder ->
  builder.bind { binding ->
    data {
      collection.each { e ->
        item {
          process( binding, e, 'name' )
          process( binding, e, 'pets' )
          process( binding, e, 'age' )
        }
      }
    }
  }
} )

それは印刷します:

<?xml version="1.0" encoding="UTF-8"?><data>
  <item>
    <name>tim</name>
    <pets>cat</pets>
    <pets>dog</pets>
  </item>
  <item>
    <name>brenda</name>
    <age>32</age>
  </item>
</data>

編集

以下のコメントの後で、あなたが何を持っているか、または何を望んでいるかはまだわかりませんが、これはあなたの基準を満たしているようです:

import groovy.xml.*

def process = { binding, element, name ->
  if( element[ name ] instanceof Collection ) {
    element[ name ].each { n ->
      binding."$name"( n )
    }
  }
  else if( element[ name ] ) {
    binding."$name"( element[ name ] )
  }
}

class Form {
  List fields  
}

// Create a new Form object
f = new Form( fields:[ [ name:'a', val:21 ], [ name:'b' ], [ name:'c', val:[ 1, 2 ], x:'field x' ] ] )

// Serialize it to XML
println XmlUtil.serialize( new StreamingMarkupBuilder().with { builder ->
  builder.bind { binding ->
    data {
      f.fields.each { fields ->
        item {
          fields.each { name, value ->
            process( binding, fields, name )
          }
        }
      }
    }
  }
} )

とプリント:

<?xml version="1.0" encoding="UTF-8"?><data>
  <item>
    <name>a</name>
    <val>21</val>
  </item>
  <item>
    <name>b</name>
  </item>
  <item>
    <name>c</name>
    <val>1</val>
    <val>2</val>
    <x>field x</x>
  </item>
</data>
于 2013-01-11T13:38:16.927 に答える