xmlslurper节点删除问题

时间:2016-06-09 23:06:32

标签: groovy xmlslurper

我有一个xml,我希望删除几个节点。我使用的想法是遍历所有根节点子节点并继续写入另一个文件,我不需要删除这些节点。

我看到的一个问题是:节点属性在我不想要的书面文件中重新排序

我的代码如下:

def xml = new XmlSlurper(false, false).parse(args[0])
ant.delete(file:fileName)
File f = new File(fileName)
xml.children().each{
     String str = it.@name
     if(some condiotion == false)
        f << groovy.xml.XmlUtil.serialize(it)

}

另一个问题是,在每个节点的开头插入

<?xml version="1.0" encoding="UTF-8"?>

2 个答案:

答案 0 :(得分:0)

问题中没有xml的具体示例。以下是如何删除节点的示例:

import groovy.xml.XmlUtil

def xml = '''
<School>
    <Classes>
        <Class>
           <Teachers>
              <Name>Rama</Name>
              <Name>Indhu</Name>
           </Teachers>
           <Name>Anil</Name>
           <RollNumber>16</RollNumber>
        </Class>
        <Class>
            <Teachers>
              <Name>Nisha</Name>
              <Name>Ram</Name>
           </Teachers>
           <Name>manu</Name>
           <RollNumber>21</RollNumber>
        </Class>
   </Classes>
</School>
'''

def parsed = new XmlSlurper().parseText( xml )

parsed.'**'.each { 
    if(it.name() == 'Teachers') {
        it.replaceNode { }
    }
}

XmlUtil.serialize( parsed )

在上面的示例中,通过执行depthFirst搜索并迭代每个节点并最终使用带有空Closure的Teachers来删除replaceNode节点。我希望这可以用作你想要的逻辑。

PS:为简洁起见,我省略了文件操作。

答案 1 :(得分:0)

API使用replacementStack。因此,只有在序列化节点时,replaceNode {}才会显示结果:

    GPathResult body = parsePath.Body
    int oldSize = parsePath.children().size()

    body.list()
    body[0].replaceNode {} // Remove o no, mas não será visivel para o objeto pai, somente no momento de serializacao. Pois a API adiciona em uma pilha de alteracao que será usada na serializacao

    String newXmlContent = XmlUtil.serialize(parsePath)
    GPathResult newParsePath = new XmlSlurper().parseText(newXmlContent)
    int newSize = newParsePath.children().size()

    assertNotNull(this.parsePath)
    assertEquals(2, oldSize)
    assertEquals(1, newSize)
    assertTrue(newSize < oldSize)
    assertNotNull(body)