真的刪除節點如何通過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 ...
我想現在找了一個星期的解決方案,這是很辛苦的......
有人的想法?
這個例子只有當你想用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