2011-08-26 87 views
3

真的删除节点如何通过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 ...

我想现在找了一个星期的解决方案,这是很辛苦的......

有人的想法?

回答

11

删除节点与其他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) 
+0

这个例子只有当你想用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

+0

我看到了问题。我专注于如何实际移除节点的问题,但是GPath表达式也是不正确的,并且只巧合地产生了期望的结果,因为它正在寻找的节点碰巧是第一个。我已经更新了我的答案。让我知道这是否更好。 –

+0

谢谢冠军,它的工作原理...我已经想知道=,这也解释了为什么有一个新的属性在xml中..现在我得到了所需的结果。我仍然没有得到的唯一东西,它现在如何与属性一起工作:''我会假设它'。''c3'=='3''但是这不起作用,并且不会使用'.text()' – Booyeoo