Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在groovy中迭代XML文件的正确方法是什么?_Xml_Groovy - Fatal编程技术网

在groovy中迭代XML文件的正确方法是什么?

在groovy中迭代XML文件的正确方法是什么?,xml,groovy,Xml,Groovy,我试图遍历一个XML文件,并打印出上下文。但是,我似乎无法解析父元素的主体,以使用这种迭代方式查找子元素: new XmlSlurper().parseText(getServiceConfigXml()) .'**' .findAll { it.name() == 'project' } .each { project -> println "Project: ${project.attributes()}" new

我试图遍历一个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()}"
        }
    }
}
当运行时,我得到这个堆栈

项目:[名称:通用]

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

捕获:org.xml.sax.SAXParseException;行号:1;列数:1;prolog中不允许包含内容

org.xml.sax.SAXParseException;行号:1;列数:1;prolog中不允许包含内容。 位于com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1239) 位于com.sun.org.apache.xerces.internal.jaxp.saxpasserimpl$jaxpsaxpasser.parse(saxpasserimpl.java:643) 在xmltest2$运行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>

统一资源定位地址
统一资源定位地址
统一资源定位地址
发件人
名称
应该是

new XmlSlurper().parseText(groovy.xml.XmlUtil.serialize(project))
但是为什么呢?为什么不继续解析节点?

应该是

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

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

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

def root=new XmlSlurper().parseText(xml)
println“项目属性:${root.attributes()}”
root.service.each{service->
println“\t服务属性:${service.attributes()}”
service.receiver.endpoint.each{endpoint->
println“\t\tEndpoint:${endpoint.attributes()}-${endpoint.text()}”
}
}

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

def root=new XmlSlurper().parseText(xml)
println“项目属性:${root.attributes()}”
root.service.each{service->
println“\t服务属性:${service.attributes()}”
service.receiver.endpoint.each{endpoint->
println“\t\tEndpoint:${endpoint.attributes()}-${endpoint.text()}”
}
}