代码之家  ›  专栏  ›  技术社区  ›  Sarang Agarwal

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

  •  1
  • Sarang Agarwal  · 技术社区  · 8 年前

    我有一个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元素,该元素下有两个语言元素,但不幸的是,这现在不可能。

    我在寻找一种方法,用city=“asd”标识所有address1标记,然后将其下面的所有子元素复制到一个字符串中。

    <address1 city="asd">
        <Language spoken="English">
            <SubLanguages>true</SubLanguages>
        </Language>
        <Language spoken="Hebrew"/>
    </address1>
    

    (表示此XML的理想方式)

    现在,我使用XMLSlurper解析XML,并使用findAll识别address1中城市标记值为“asd”的所有节点。我陷入困境的是如何将每个标记内的其余子元素作为字符串复制

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   tim_yates    8 年前

    您可以使用 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()
    
    推荐文章