【问题标题】:Groovy XmlSlurper method to create GPathGroovy XmlSlurper 方法创建 GPath
【发布时间】:2014-04-29 18:58:25
【问题描述】:

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

这是 XML 的 sn-p:

<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")
        }
    }
}

【问题讨论】:

    标签: xml json groovy xml-parsing


    【解决方案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 的大小,意图会有所不同。

    【讨论】:

    • 谢谢,这成功了……是的,我发布的 XML 是一个非常简化的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多