用于创建GPath的Groovy XmlSlurper方法

时间:2014-04-29 18:58:25

标签: xml json groovy xml-parsing

我试图解析一个大型XML文件以转换为JSON文档,并且我想创建一个构造XmlSlurper查找表达式的方法,但我遇到了麻烦。

以下是XML的摘录:

<site>
  <metrics>
    <ruleScore>
      <avg>89.0</avg>
    </ruleScore>
  </metrics>
</site>

以下是方法:

static def getDecNode(String parentNode String childNode) {
    return data.metrics.parentNode.childNode.find { it.name() == childNode }.toDouble()
}

从那里我会称之为:

def root = json {
    type record
    time { $date timestamp }
    data {
        ruleScore {
            avg getDecNode("ruleScore","avg")
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使getDecNode成为一个闭包,允许访问脚本中存在的已解析的xml,然后构建json。另请注意,闭包内部的实现(使用GString):

def xml='''
<site>
  <metrics>
    <ruleScore>
      <avg>89.0</avg>
    </ruleScore>
  </metrics>
</site>
'''

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

def getDecNode = {String parentNode, String childNode ->
    slurper.metrics."$parentNode"
                   ."$childNode"
                   .find { it.name() == childNode }
                   .toDouble()
}

//Building JSON
def builder = new groovy.json.JsonBuilder()
builder {
    type 'record'
    time { $date 'timestamp' }
    data {
        ruleScore {
            avg getDecNode("ruleScore","avg")
        }
    }
}

builder.toPrettyString()

上面的注释,我假设JSON元素值为字符串,因此'record''timestamp'。它们可以根据要求进行更换。

我无法预见方法/闭包的单独实现规划带来的好处,但我认为基于xml的大小,意图会有所不同。