Boo*_*eoo 3 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)
Run Code Online (Sandbox Code Playgroud)
似乎工作但是!!!! 当我把它翻译成我的问题时,它仍然保存原来的xml althoguh在运行remove-method后返回true.
我google了一下,发现了这个BUG.似乎我现在受到了影响.我怎么解决呢?是否有解决方法,或者我必须回到根源并开始按行复制它?groovy真的是ungroovy在这里: - /
编辑:如下所示,并从中获得经验,不可能以这种方式删除等于'e'的标签.只会移除第一个记录.我认为xml格式存在问题.没有所需的格式:
<A x='1' y='2'></A>
并以格式
<A> <x>1</x> <y>2</y> </A>
有人能够重现这个错误吗?
edit2:我使用的是GroovyConsole 1.8.0.在示例中添加了c3属性.试图用相同的方法删除它,相同的bug:第一个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)
Run Code Online (Sandbox Code Playgroud)
结果是第一部分属性c3变为3?!?!?!?!?WTF ...
我现在试图找到一个星期的解决方案,这非常令人筋疲力尽......
有人有点想法吗?
Jus*_*per 12
删除节点与其他DOM API非常相似.您必须将要删除的节点传递给其父节点的remove方法.
另外,=运营商在Groovy赋值运算符.it.@C1 = 'a'将分配'a'给文档C1中每个B节点的属性.由于该赋值的结果'a'是true由Groovy 强制执行的,因此find将始终返回它遇到的第一个节点.
xml=new XmlParser().parseText(x)
def nodeToDel=xml.A.B.C1.find { it.text() == 'a' }
def parent = nodeToDel.parent()
parent.remove(nodeToDel)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12258 次 |
| 最近记录: |