如何通过XMLParser真正删除节点:
x='''<X>
<A>
<B c3='1'>
<C1>a</C1>
<C2>b</C2>
</B>
<B c3='2'>
<C1>e</C1>
<C2>e</C2>
</B>
<B c3='3'>
<C1>f</C1>
<C2>f</C2>
</B>
</A>
</X>
'''
xml=new XmlParser().parseText(x)
def nodeToDel=xml.A.B.find{it.@C1='a'}
xml.remove(nodeToDel)
println xml
new XmlNodePrinter(new PrintWriter(new FileWriter(new File('c:/temp/a.xml')))).print(xml)似乎很管用,但是!当我将其转换为我的问题时,它仍然保存了运行remove-method后返回true的原始xml文件。
我在谷歌上搜索了一下,找到了这个错误。就像我现在受到的影响一样。我该怎么解决呢?有什么解决办法吗,还是我必须回到原来的地方,开始抄袭它的行文?groovy在这里真的很不错吗:-/
编辑:如下所述,并从中获得经验,不可能以这种方式删除等于e的标记。只有第一个记录将被删除。我认为xml格式存在问题。没有所需的格式:
<A x='1' y='2'></A>
而且它的格式
<A> <x>1</x> <y>2</y> </A>
有人能复制这种虫子吗?
edit2:我使用的是GroovyConsole 1.8.0。将c3属性添加到示例中。试图用同样的方法删除它,同样的错误:第一个B节被删除了.现在,最令人印象深刻的bug:尝试与其他代码:
def xml=new XmlParser().parseText(x)
xml.A.remove(xml.A.B.find{it.@'c3'= '3'}) //want to remove third section
new XmlNodePrinter(new PrintWriter(new FileWriter(new File('c:/temp/a.xml')))).print(xml)结果,第一节属性c3更改为3?wtf..。
我想找一个星期的解决办法,真是累人.
有人有主意吗?
发布于 2011-08-26 15:13:17
删除节点与其他DOM非常相似。必须将要删除的节点传递给其父节点的remove方法。
=操作符也是Groovy中的赋值操作符。it.@C1 = 'a'将'a'分配给文档中每个B节点的C1属性。由于这个赋值的结果是'a',这是Groovy强迫true的,所以find总是返回它遇到的第一个节点。
xml=new XmlParser().parseText(x)
def nodeToDel=xml.A.B.C1.find { it.text() == 'a' }
def parent = nodeToDel.parent()
parent.remove(nodeToDel)发布于 2020-01-24 18:32:09
改进Justin 的解决方案,并给出一个完整的示例:
def xml = new XmlParser().parseText('''
<root>
<element id="10" />
<element id="20" />
</root>
''')
def nodeToDel = xml.find { it["@id"] == '20' }
if (nodeToDel) {
nodeToDel.parent().remove(nodeToDel)
}
println xmlhttps://stackoverflow.com/questions/7201111
复制相似问题