xml - 真正删除 XMLParser 对象 Groovy 中的节点

标签 xml groovy xml-parsing

如何通过 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)

似乎有效但是!!!! 当我将其翻译成我的问题时,它仍然保存原始 xml althoguh 在运行 remove-method 后返回 true。

我用谷歌搜索了一下,找到了这个 BUG .看来我现在受到了影响。我该如何解决?有没有解决方法,或者我必须回到根源并开始按行复制它......?? groovy 在这里真的很普通 :-/

编辑:如下所述,并从中获得了经验,无法通过这种方式删除等于“e”的标签。只有第一个记录将被删除。我认为是xml格式有问题。没有所需的格式:

<A x='1' y='2'></A>

并以格式

<A> <x>1</x> <y>2</y> </A>

有人能重现这个错误吗?

edit2:我正在使用 GroovyConsole 1.8.0。在示例中添加了 c3 属性。试图用同样的方法删除它,同样的错误:第一个 B 部分被删除了...... 现在最令人印象深刻的错误:用其他代码尝试:

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?!?!?!?!?卧槽……

我一直在努力寻找一个星期的解决方案,这很累......

有人有想法吗?

最佳答案

删除节点的工作方式与其他 DOM API 非常相似。您必须将要删除的节点传递给其父节点的删除方法。

= 运算符也是 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)

关于xml - 真正删除 XMLParser 对象 Groovy 中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7201111/

相关文章:

python - 访问python中的所有xml值,其中有几个具有相同的名称

linux - 使用 Gradle 连接 Linux 上的文件

java - 每次/每天随机数

xml - 使用 IMPORTXML 检索号码时遇到问题

java - JAXB 解码 XML 类转换异常

xml - 如何在 XQuery 中检查节点 $N 是否存在于节点序列 $S 中?

android - 如何在 Android 中设置按钮内可绘制矢量的大小?

java - 使用spring在groovy脚本中配置java类的属性

java - XML读取属性和元素

ruby - 如何从字符串中删除转义字符? UTF 的问题?