0

ID と文字列のパスのマップを指定して、xml ドキュメントを解析して構築する必要があります。

1) ID 付きのパスのマップ (データベースから収集) は次のとおりです。

def trees = [:]
trees.put(1,"TEST/folder1")
trees.put(2,"TEST/folder2")
trees.put(3,"TEST/folder1/folder1.1")
trees.put(4,"TEST/folder2/folder2.1/folder2.1.2")
trees.put(5,"TEST/folder1/folder1.2") 
trees.put(6,"TEST/folder1/folder1.2/folder1.2.1/")                        
trees.put(7,"TEST/folder1/folder1.2/folder1.2.2/")
trees.put(8,"TEST/folder1/folder1.2/folder1.2.2/1.2.2.1")       

2) クロージャの定義

def parseTreeNodes(HashMap<Integer,String> t) {
    def treeNodes = [:]
    def nodeItems = []
    def subItems=[]
    t.each { k,v ->
        subItems = v.split('/')
        subItems.eachWithIndex { node,i ->
            if(!treeNodes.values().contains(node)) {
                treeNodes.put(id:k,[depth:i,node:node,parent:subItems[i-1]])
            }
        }
    }
    println treeNodes.toString() + "---"
}

3) クロージャーを呼び出す

parseTreeNodes(trees)

このフィルターに xml 変換を適用して、重複することなく出力として xml doc を取得する方法は?

4) xml ツリーを変換して名前と ID (最初の繰り返しから抽出) を持つ属性を取得するためのグルーヴィーな方法はありますか ???

<folder name="folder1" id="1" depth="1">
      <folder name="folder1.2" id="2" path="folder1/folder1.2" depth="2"/>
 <folder> 
...

実際、次のマップにはすでにすべてのデータが含まれています。

def treeNodes = [:]
     trees.each { k,v ->
                    subItems = v.split('/')
                    subItems.eachWithIndex { node,i ->
                        if(!treeNodes.values().contains(node)) {
                            treeNodes.put(id:k,[depth:i,node:node,parent:subItems[i-1]])
                        }
                    }
                }
4

1 に答える 1

0

フォルダーのマップを生成するには、次のようにすることができます。

// Build a map of folders (see https://gist.github.com/kiy0taka/2478499)
def rslt = { [:].withDefault{ owner.call() } }().with { t ->
  trees.each { k, v ->
    v.tokenize( '/' ).inject( t ) { tr, i -> tr[ i ] }
  }
  t
}

次に、マップのマップをxmlに変換するためのこのようなもの

// Taken from https://gist.github.com/uehaj/875631
sw = new StringWriter()
new groovy.xml.MarkupBuilder(sw).with {
  visitor = { k, v -> "$k" { v instanceof Map ? v.collect(visitor) : mkp.yield(v) } }
  root { rslt.collect visitor }
}

だから今呼び出し:

println sw.toString()

プリント:

<root>
  <TEST>
    <folder1>
      <folder1.1 />
      <folder1.2>
        <folder1.2.2>
          <1.2.2.1 />
        </folder1.2.2>
      </folder1.2>
    </folder1>
    <folder2>
      <folder2.1>
        <folder2.1.2 />
      </folder2.1>
    </folder2>
  </TEST>
</root>
于 2013-02-27T15:06:22.013 に答える