我有一个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"?>
答案 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)