我有一个看起来像这样的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的第一个问题,所以如果我不够清楚/错过了一些正确的格式/样式,我会提前道歉! 谢谢你的理解!
答案 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()