Groovy将列表的xml更新为条件保留其他对象的列表

时间:2018-08-20 04:25:58

标签: xml list groovy

我正在尝试使用groovy。

简单的 input.xml

<response>
    <quote>
        <alpha>
            <a>1</a>
            <b>2</b>
        </alpha>
        <beta>
            <gama>
                <a1>12</a1>
                <a2>13</a2>
            </gama>
            <specifics>
                <key>fname</key>
                <value>Tom</value>
            </specifics>
            <specifics>
                <key>lname</key>
                <value>Cruise</value>
            </specifics>
            <specifics>
                <key>phone</key>
                <value>12345</value>
            </specifics>
            <specifics>
                <key>address</key>
                <value>NewYork</value>
            </specifics>
        </beta>
    </quote>
</response>

期望的 output.xml

<response>
    <quote>
        <alpha>
            <a>1</a>
            <b>2</b>
        </alpha>
        <beta>
            <gama>
                <a1>12</a1>
                <a2>13</a2>
            </gama>
            <specifics>
                <fname>Tom</fname>
                <lname>Cruise</lname>
                <phone>12345</phone>
                <address>newYork</address>
            </specifics>
        </beta>
    </quote>
</response>

我在这里想要做的是保留完整的xml对象,但是要进行一次修改。如您所见,specifics标签是一个列表,因此重复了很多次。但是,每个specifics标签内部仅包含keyvalue。条件是寻找标签specifics并删除keyvalue标签,并添加一个元素,其中键为元素key的值,值为元素{{1}的值}。

我尝试使用类似这样的groovy收集

value

,但最终失去了其他要素。就我而言,所有其他元素都应在输出中存在,并且对此data.collect { "$it.key $it.value" } 标记进行修改。请告知。

1 个答案:

答案 0 :(得分:0)

def x=new XmlParser().parseText('''<response>
    <quote>
        <alpha>
            <a>1</a>
            <b>2</b>
        </alpha>
        <beta>
            <gama>
                <a1>12</a1>
                <a2>13</a2>
            </gama>
            <specifics>
                <key>fname</key>
                <value>Tom</value>
            </specifics>
            <specifics>
                <key>lname</key>
                <value>Cruise</value>
            </specifics>
            <specifics>
                <key>phone</key>
                <value>12345</value>
            </specifics>
            <specifics>
                <key>address</key>
                <value>NewYork</value>
            </specifics>
        </beta>
    </quote>
</response>''')

v1

//this variant almost do the job except creating parent for all specifics
x.quote.beta.specifics.each{spec->
    spec.replaceNode { "${spec.key.text()}"( spec.value.text() ) }
}
println groovy.xml.XmlUtil.serialize(x)
...
<beta>
  <gama>
    <a1>12</a1>
    <a2>13</a2>
  </gama>
  <fname>Tom</fname>
  <lname>Cruise</lname>
  <phone>12345</phone>
  <address>NewYork</address>
</beta>

v2 与以前的

几乎相同
x.quote.beta.specifics.each{spec->
    spec.replaceNode { "specifics"( "key":spec.key.text(),  spec.value.text() ) }
}
println groovy.xml.XmlUtil.serialize(x)
<beta>
  <gama>
    <a1>12</a1>
    <a2>13</a2>
  </gama>
  <specifics key="fname">Tom</specifics>
  <specifics key="lname">Cruise</specifics>
  <specifics key="phone">12345</specifics>
  <specifics key="address">NewYork</specifics>
</beta>

v3所需的结果

Node newspec = new Node(null,"specifics")
x.quote.beta.specifics.each{spec->
    newspec.appendNode("${spec.key.text()}", null, spec.value.text() )
    spec.parent().remove(spec)
}
x.quote.beta[0].append(newspec)
println groovy.xml.XmlUtil.serialize(x)