2017-05-04 52 views
0

我試圖遍歷一個XML文件,並打印出上下文。然而,它似乎並不像我可以解析的父元素的車身,採用迭代的這種方式來尋找子元素:在groovy中迭代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; lineNumber:1; columnNumber:1;序言中不能有內容。

org.xml.sax.SAXParseException; lineNumber:1; columnNumber:1;序言中不能有內容。 at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1239) at 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> 

回答

3

你可以做這個代替,而不是試圖一次又一次重新解析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()}" 
    } 
} 
0

應該

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

但是,爲什麼?爲什麼不繼續解析節點?

相關問題