2014-10-03 34 views
0

我想使用groovy從XML文件中刪除一些元素,但是這似乎不起作用。如何從XML文件中刪除節點

任何想法如何解決這個問題?

def DeploymentDescriptors = new XmlSlurper().parse("pathToMyXMLFile") 
DeploymentDescriptors.NameValuePairs.NameValuePair.each { 
if(it.name == 'B') 
    it.replaceNode{} 
} 

XML文件

<DeploymentDescriptors> 
    <NameValuePairs> 
     <NameValuePair> 
      <name>A</name> 
      <value>Value A</value> 
     </NameValuePair> 
     <NameValuePair> 
      <name>B</name> 
      <value>Value B</value> 
     </NameValuePair> 
     <NameValuePair> 
      <name>C</name> 
      <value>Value C</value> 
     </NameValuePair> 
    </NameValuePairs> 
</DeploymentDescriptors> 

回答

2

XmlSlurper,直到有需要不改變處理XML。如果你序列化你會看到效果。

這裏的工作實施例:

import groovy.xml.StreamingMarkupBuilder 
import groovy.xml.XmlUtil 
def xml = """ 
<DeploymentDescriptors> 
    <NameValuePairs> 
     <NameValuePair> 
      <name>A</name> 
      <value>Value A</value> 
     </NameValuePair> 
     <NameValuePair> 
      <name>B</name> 
      <value>Value B</value> 
     </NameValuePair> 
     <NameValuePair> 
      <name>C</name> 
      <value>Value C</value> 
     </NameValuePair> 
    </NameValuePairs> 
</DeploymentDescriptors>""" 

def parsed = new XmlSlurper().parseText(xml) 
parsed.NameValuePairs.NameValuePair.findAll { it.name.text() == 'B' }*.replaceNode{} 
println XmlUtil.serialize(new StreamingMarkupBuilder().bind { 
    mkp.yield parsed 
}) 
+0

功能'find'找到的第一個值相匹配的閉合狀態。所以如果有兩個名字爲'B'的節點,你將只刪除1.OP使用'each',所以我想他想刪除所有的出現。 – 2014-10-03 10:18:50

+0

感謝@xwid指出了這一點。用'each'和條件塊代替'find'。 – Opal 2014-10-03 10:25:38

+0

您應該使用'findAll'而不是'each'。 – 2014-10-03 10:29:25