我有一个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"?>发布于 2016-06-10 07:49:06
问题中没有xml的具体示例。下面是一个删除Node的示例:
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搜索并迭代每个节点,最后使用带有空闭包的replaceNode来删除Teachers节点。我希望这可以作为你想要的逻辑。
PS:为简洁起见,我省略了文件操作。
发布于 2018-02-01 20:39:45
该应用程序接口与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)https://stackoverflow.com/questions/37737575
复制相似问题