2011-08-26 94 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