【问题标题】:What is the proper way to iterate through a XML file in groovy?在 groovy 中遍历 XML 文件的正确方法是什么?
【发布时间】:2017-05-04 12:27:12
【问题描述】:

我正在尝试遍历一个 XML 文件,并打印出上下文。但是,我似乎无法解析父元素的主体,以使用这种迭代方式查找子元素:

new XmlSlurper().parseText(getServiceConfigXml())
            .'**'
            .findAll { it.name() == 'project' }
            .each { project ->
println "Project: ${project.attributes()}"
new XmlSlurper().parseText("${project.text()}")
              .'**'
              .findAll { it.name() == 'service' }
              .each { service ->
    println "\tService: ${service.attributes()}"
    new XmlSlurper().parseText("${service.text()}")
                    .'**'
                    .findAll { it.name() == 'endpoint' }
                    .each { endpoint ->
        println "\t\tEndpoint: ${endpoint.attributes()} - ${endpoint.text()}"
        }
    }
}

运行时,我得到这个堆栈

项目:[name:Common]

[致命错误] :1:1: prolog 中不允许内容。

捕获:org.xml.sax.SAXParseException;行号:1;列号:1;序言中不允许有内容。

org.xml.sax.SAXParseException;行号:1;列号:1;序言中不能有内容。 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1239) 在 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643) 在 xmltest2$_run_closure2.doCall(xmltest2.groovy:35) 在 xmltest2.run(xmltest2.groovy:29) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

进程以退出代码 1 结束

所以我似乎无法将“${project.text()}”解析为第二个 XMLSlurper。 (注意第一个 println 正确执行)

那么做我想做的事情的正确方法是什么?

编辑:这是我要遍历的 XML 文件的一个小示例:

<project name='Common'>
<service name='name' pattern='something' isReliable='maybe'>
  <receiver name='name' isUsingTwoWaySsl='maybe' isWsRmDisabled='maybe' targetedByTransformation='maybe'>
    <endpoint name='local_tst01'>URL</endpoint>
    <endpoint name='local_tst02'>URL</endpoint>
    <endpoint name='local_tst03'>URL</endpoint>
    <environment name='dev' default='local_dev' />
    <environment name='tst01' default='test' />
    <environment name='tst02' default='local_tst02' />
  </receiver>
  <operation name='name'>
    <sender>sender</sender>
    <attribute name='operation' type='String'>name</attribute>
  </operation>
</service>
</project>

【问题讨论】:

    标签: xml groovy


    【解决方案1】:

    您可以这样做,而不是一次又一次地重新解析 XML...

    def root = new XmlSlurper().parseText(xml)
    
    println "Project attributes: ${root.attributes()}"
    root.service.each { service ->
        println "\tService attributes: ${service.attributes()}"
        service.receiver.endpoint.each { endpoint ->
            println "\t\tEndpoint: ${endpoint.attributes()} - ${endpoint.text()}"
        }
    }
    

    【讨论】:

      【解决方案2】:

      应该是

      new XmlSlurper().parseText(groovy.xml.XmlUtil.serialize(project))
      

      但是为什么呢?为什么不继续解析节点?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-16
        • 1970-01-01
        • 2014-03-11
        • 2018-08-22
        • 1970-01-01
        相关资源
        最近更新 更多