在XMLParser的对象的Groovy
问题描述:
真的删除节点如何通过XMLParser的真的要删除一个节点:在XMLParser的对象的Groovy
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{[email protected]='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。
我用google搜索了一下,发现这个BUG。而且现在看来我受到了影响。我如何解决它?有没有解决方法,还是我必须回到根,并开始复制它linewise ...?是常规真的ungroovy这里: -/
编辑:如下编写,并得到了这些经验,这是不可能去除其中等于“E”这样的标签。只有第一个记录将被删除。我认为这是XML格式的问题。不具有所需的格式:
<A x='1' y='2'></A>
,并让它在格式
<A> <x>1</x> <y>2</y> </A>
是有人能够重现这个bug?
edit2:我正在使用GroovyConsole 1.8.0。向示例添加了c3属性。试图用同样的方法,同样的错误删除:除去第一部分B ... 现在最令人印象深刻的错误:与其他代码试了一下:第一部分财产C3改变
def xml=new XmlParser().parseText(x)
xml.A.remove(xml.A.B.find{[email protected]'c3'= '3'}) //want to remove third section
new XmlNodePrinter(new PrintWriter(new FileWriter(new File('c:/temp/a.xml')))).print(xml)
结果到3?!?!?!?!? WTF ...
我想现在找了一个星期的解决方案,这是很辛苦的......
有人的想法?
答
删除节点与其他DOM API非常相似。您必须将要删除的节点传递给其父节点的remove方法。
另外=
运算符是Groovy中的赋值运算符。 [email protected] = '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)
这个例子只有当你想用C1 ='a'来探索scetion时才有效。但它不起作用,当你想删除C1 ='e'例如...它似乎只是删除第一个条目..我认为每个人都会假设只是将'a'改为'e',但你会看到它不工作... o请告诉我,你也会得到错误的结果。我使用了下面的代码: 'xml = new XmlParser()。parseText(x) def nodeToDel = xml.ABfind {it。@ C1 ='e'} def parent = nodeToDel.parent() parent.remove (新的FileWriter(新文件('c:/temp/a.xml'))))。print(xml)' – Booyeoo
我看到了问题。我专注于如何实际移除节点的问题,但是GPath表达式也是不正确的,并且只巧合地产生了期望的结果,因为它正在寻找的节点碰巧是第一个。我已经更新了我的答案。让我知道这是否更好。 –
谢谢冠军,它的工作原理...我已经想知道=,这也解释了为什么有一个新的属性在xml中..现在我得到了所需的结果。我仍然没有得到的唯一东西,它现在如何与属性一起工作:''我会假设它'。''c3'=='3''但是这不起作用,并且不会使用'.text()' – Booyeoo