0

LinkedHashMap を指定して、groovy で完全な xml ツリーを構築しようとしています。

1) マップ:

def trees = [:]
trees.put(1,[id:'1',path:'ROOT/folder1',name:'folder1',isFolder:'true'])
trees.put(2,[id:'2',path:'ROOT/folder1/folder1.1',name:'folder1.1',isFolder:'true'])
trees.put(3,[id:'3',path:'ROOT/folder1/folder1.1/folder1.1.1',name:'folder1.1.1',isFolder:'true'])
trees.put(4,[id:'4',path:'ROOT/folder2',name:'folder2',isFolder:'true'])
trees.put(5,[id:'5',path:'ROOT/folder3',name:'folder3',isFolder:'true'])
trees.put(6,[id:'6',path:'ROOT/folder3/folder3.1',name:'folder3.1',isFolder:'true'])

2) ソート ツリー クロージャ:

//def rslt = { [:].withDefault{ owner.call() } }
def a = []
def rslt = { [:].withDefault{ owner.call() } }().with { t ->
  trees.each { k, v ->
    v.path.tokenize( '/' ).inject( t ) { tr, i -> tr[ i ] }
  }
  return t
}

3) たとえば、xml スラーパーを使用して Xml ドキュメントを作成する方法

モデルは次のようになります。

<ROOT>
<folder1 name="folder1" id="1" parent="ROOT" depth="1" path="ROOT/folder1">
      <folder1.1 name="folder1.1" id="2" parent="folder1" depth="2" path="ROOT/folder1/folder1.1">
           <folder1.1.1 name="folder1.1.1" id="3" parent="folder1.1" depth="3" path="ROOT/folder1.1/folder1.1.1"/>
       </folder1.1>
</folder1>
...
</ROOT>

groovy.xml.MarkupBuilder(sw).with { のような sthg を使用してクロージャを探します

アイデアや提案はありますか?

BR。

4

1 に答える 1

0

groovy.xml.StreamingMarkupBuilderノード マップを再帰的に処理することで、XML を構築できます。ただし、2 番目のステップで作成したマップでは、定義されているすべての属性が失われtreesます。それらを保持するには、最初にその部分を変更する必要があります。

// An empty map. Default value for nonexistent elements is an empty map.
def struc = {[:].withDefault{owner.call()}}()

trees.each { key, val ->
    // iterate through the tokenized path and create missing elements along the way
    def substruc = struc
    val.path.tokenize('/').each {
        // if substruc.nodes does not exist it will be created as an empty map
        // if substruc.nodes[it] does not exist it will be created as an empty map
        substruc = substruc.nodes[it]
    }
    // assign the attributes to the map in .attr
    val.each{ attrKey, attrVal ->
        substruc.attr[attrKey] = attrVal
    }
}

これにより、次のようなマップが作成されます。

[nodes: [ROOT: [nodes: [folder1: [attr: [id:1, ...], nodes: [...]]]]]

で使用されるクロージャは、StreamingMarkupBuilder別のクロージャを使用してノードをstruc再帰的に反復し.attr、ノードの属性および.nodesノー​​ドの子ノードとして割り当てます。

// we will use this builder to create our XML
def builder = new groovy.xml.StreamingMarkupBuilder()
builder.encoding = "UTF-8"

// closure for our xml structure
def xml = {
    // closure to be recursively called for each element in the nodes maps
    def xmlEach
    xmlEach = {
        key, val ->
            out << {
                "${key}"(val.attr) {
                    val.nodes.each(xmlEach)
                }
            }
    }
    struc.nodes.each(xmlEachClosure)
}

println builder.bind(xml)

出力として、次のような XML が得られます。

<ROOT>
    <folder1 id='1' path='ROOT/folder1' name='folder1' isFolder='true'>
        <folder1.1 id='2' path='ROOT/folder1/folder1.1' name='folder1.1' isFolder='true'>
            <folder1.1.1 id='3' path='ROOT/folder1/folder1.1/folder1.1.1' name='folder1.1.1' isFolder='true'></folder1.1.1>
        </folder1.1>
    </folder1>
...
</ROOT>
于 2013-03-04T14:04:50.070 に答える