获取Groovy

时间:2017-10-31 13:11:33

标签: xml groovy soapui xmlslurper

我有一个看起来像这样的XML文档

<home>
    <address>
        <address1 city="asd">
            <Language spoken="English">
                <SubLanguages>true</SubLanguages>
            </Language>
        </address1>
        <address1 city="asd1">
            <Language spoken="Spanish"/>
        </address1>
        <address1 city="asd">
            <Language spoken="Hebrew"/>
        </address1>
    </address>
</home>

如您所见,地址1城市=&#34; asd&#34;标记在XML中出现两次。我知道理想的方法是让一个address1元素同时包含两个语言元素,但不幸的是,现在这是不可能的。

我正在寻找的方法是使用city =&#34; asd&#34;识别所有address1标签。然后将其下面的所有子元素复制到一个字符串中。 所以基本上,我正在寻找的是一个看起来像

的字符串
<address1 city="asd">
    <Language spoken="English">
        <SubLanguages>true</SubLanguages>
    </Language>
    <Language spoken="Hebrew"/>
</address1>

(表示此XML的理想方式)

现在,我正在使用XMLSlurper来解析XML并使用findAll来识别address1中city标记的值为&#34; asd&#34;的所有节点。我遇到的问题是如何将每个标签内的其余子元素复制为字符串

这是我关于SO的第一个问题,所以如果我不够清楚/错过了一些正确的格式/样式,我会提前道歉! 谢谢你的理解!

1 个答案:

答案 0 :(得分:1)

您可以使用StreamingMarkupBuilder将子项插入到新文档中(假设您的现有xml位于名为xml的变量中):

import groovy.xml.*

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

def newXml = new StreamingMarkupBuilder().bind {
    address1(city: 'asd') {
        home.address.address1
            .findAll { it.@city.text() == 'asd' }
            .each { mkp.yield it.children() }
    }
}.toString()