我正在尝试使用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
标签内部仅包含key
和value
。条件是寻找标签specifics
并删除key
和value
标签,并添加一个元素,其中键为元素key
的值,值为元素{{1}的值}。
我尝试使用类似这样的groovy收集
value
,但最终失去了其他要素。就我而言,所有其他元素都应在输出中存在,并且对此data.collect { "$it.key $it.value" }
标记进行修改。请告知。
答案 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)