2016-08-31 5 views
0

xmlから子ノードを削除しようとしています。私のスクリプトは動作していますが、子ノードは削除されません。削除したいノードだけではありません。XML内の子ノードを削除

import groovy.xml.*; 
def employees='''<Employees> 
         <Employee> 
         <ID>123</ID> 
         <Name>xyz</Name> 
         <Addresses> 
          <Address> 
           <Country>USA</Country> 
           <ZipCode>40640</ZipCode> 
          </Address> 
          </Addresses> 
         </Employee> 
         <Employee> 
         <ID>345</ID> 
         <Name>abc</Name> 
         <Addresses> 
          <Address> 
           <Country>CA</Country> 
           <ZipCode>50640</ZipCode> 
          </Address> 
          </Addresses> 
         </Employee> 
        </Employees>''' 
def fields = ['Name','ZipCode'] 
def xml = new XmlParser().parseText(employees) 
xml.Employee.each { node -> 
    node.children().reverse().each{ 
     if(!fields.contains(it.name())) { 
      node.remove(it) 
     } 
    } 
} 

XmlUtil.serialize(xml) 

xmlの各従業員からノードZipCodeを削除するにはどうすればよいですか?

答えて

2

以下のように:

import groovy.xml.* 

def employees='''<Employees> 
         <Employee> 
         <ID>123</ID> 
         <Name>xyz</Name> 
         <Addresses> 
          <Address> 
           <Country>USA</Country> 
           <ZipCode>40640</ZipCode> 
          </Address> 
          </Addresses> 
         </Employee> 
         <Employee> 
         <ID>345</ID> 
         <Name>abc</Name> 
         <Addresses> 
          <Address> 
           <Country>CA</Country> 
           <ZipCode>50640</ZipCode> 
          </Address> 
          </Addresses> 
         </Employee> 
        </Employees>''' 
def fields = ['Name','ZipCode'] 

def xml = new XmlParser().parseText(employees) 

xml.'**'.findAll { it.name() in fields }*.replaceNode { } 

XmlUtil.serialize(xml) 

深さ優先探索doinfながらノード名はfieldsのリストに存在する場合にチェックします。存在する場合、ノードを削除します。上記の例では、NameZipCodeが削除されています。

+0

ありがとうございます!これは私が期待していた方法で動作します!! –

+0

私のアプリケーションが投げているので、replaceNodeの代わりにremoveメソッドを使う方法はありますか?メソッドのシグネチャはありません:groovy.util.Node.replaceNode()そして私が依存関係を追加することはできません!! –

関連する問題