2

我有以下xml:

<list>         
<cars>   
<model>2012</model>
<make>GM</make>         
</cars>    
</list>

我想将这些值打印为路径:值,如下所示。

list/cars/model : 2012
list/cars/make : GM

我怎样才能做到这一点?我尝试了该name()方法,但它只打印子项目的名称。我想打印整个路径直到元素。

我只能使用 xmlSlurper 解析器来执行此操作。

谢谢。

4

2 回答 2

1
def xml = '''
<list>         
    <cars>   
        <model>2012</model>
        <make>GM</make>
        <color>Gold</color>
    </cars>    
</list>
'''

def item = new XmlSlurper().parseText(xml)

item.'**'.inject([]) { acc, val ->
    def localText = val.localText()
    acc << val.name()

    if( localText ) {
        println "${acc.join('/')} : ${localText.join(',')}"
        acc = acc.dropRight(1) // or acc = acc[0..-2]
    } 
    acc
}

这将根据需要打印。上面是depthFirst()在树上使用搜索并使用注入(只是不要改变任何其他列表)并查找localText(). 如果localText()遇到指示叶节点的值,则打印路径和值。该路径已累积在用于注入的列表中。一个简单join()的将给出所需的格式。

以上已在 Groovy 2.4.5 中成功测试。如果localText()不可用,NodeChild那么早于 2.3.0 的 Groovy 版本将是原因,因为自 2.3.0 以来已添加该方法

于 2016-01-11T03:27:59.597 回答
1
import groovy.util.XmlSlurper
import groovy.util.slurpersupport.NodeChild;
def rootNode = new XmlSlurper().parseText('<root><one a1="uno!"/><two>Some text!</two></root>' )

def printMap 
printMap = {node, path->
     if(node.getClass() == NodeChild){
        node.childNodes().each{
           printMap(it, (path ? path + "/" : "") + node.name())
        }
     } else {
        println "${path}/${node.name()}:${node.text()}"
     }
 }
 printMap(rootNode, "")
于 2016-01-10T23:06:06.890 回答