2016-08-31 8 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) 

Как удалить узел ZipCode от каждого сотрудника в xml?

ответ

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) 

Это проверяет, является ли имя узла присутствует в списке fields пока doinf глубиной первого поиска. Если присутствует, то он удаляет узел. В приведенном выше примере удаляются Name и ZipCode.

+0

Большое спасибо! Это работает так, как я ожидал !! –

+0

Есть ли способ сделать это с помощью метода remove вместо replaceNode, поскольку мое приложение бросает Нет сигнатуры метода: groovy.util.Node.replaceNode(), и я не могу добавить зависимость! –

Смежные вопросы