获取 2 个元素之间的所有元素,包括 Groovy 中的其他元素、值和属性

Get all elements between 2 elements including other elements, values and attributes in Groovy

我有一个 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>

如您所见,address1 city="asd" 标签在 XML 中出现了两次。我知道理想的方法是在一个 address1 元素下同时包含两个 Language 元素,但不幸的是,现在这是不可能的。

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

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

(表示此 XML 的理想方式)

现在,我正在使用 XMLSlurper 解析 XML 并使用 findAll 识别地址 1 中城市标签值为 "asd" 的所有节点。我卡住的地方是如何将每个标签内的其余子元素全部复制为 Strings

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

您可以使用 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()