2016-06-09 56 views
0

我有一个xml从哪里我想删除几个节点。我使用的想法是运行所有的根节点的孩子,并不断写入另一个文件那些我不需要删除的节点。xmlslurper节点删除问题

一个问题,我看到的是:该节点的属性获取的书面文件,我不想

我的代码看起来像重新排序:

def xml = new XmlSlurper(false, false).parse(args[0]) 
ant.delete(file:fileName) 
File f = new File(fileName) 
xml.children().each{ 
    String str = [email protected] 
    if(some condiotion == false) 
     f << groovy.xml.XmlUtil.serialize(it) 

} 

的另一个问题是,在每一个节点的开头就插入

<?xml version="1.0" encoding="UTF-8"?> 

回答

0

问题中没有具体的xml示例。这里是一个例子的节点如何可以被移除:

import groovy.xml.XmlUtil 

def xml = ''' 
<School> 
    <Classes> 
     <Class> 
      <Teachers> 
       <Name>Rama</Name> 
       <Name>Indhu</Name> 
      </Teachers> 
      <Name>Anil</Name> 
      <RollNumber>16</RollNumber> 
     </Class> 
     <Class> 
      <Teachers> 
       <Name>Nisha</Name> 
       <Name>Ram</Name> 
      </Teachers> 
      <Name>manu</Name> 
      <RollNumber>21</RollNumber> 
     </Class> 
    </Classes> 
</School> 
''' 

def parsed = new XmlSlurper().parseText(xml) 

parsed.'**'.each { 
    if(it.name() == 'Teachers') { 
     it.replaceNode { } 
    } 
} 

XmlUtil.serialize(parsed) 

在上述例子中,Teachers节点通过执行深度优先搜索并遍历每个节点,最后使用replaceNode与空封闭移除。我希望这可以用作你想要的逻辑。 PS:为简洁起见,我省略了文件操作。

0

该API使用replacementStack工作。因此,只有在序列化节点时,replaceNode {}才会显示结果,如下所示:

GPathResult body = parsePath.Body 
    int oldSize = parsePath.children().size() 

    body.list() 
    body[0].replaceNode {} // Remove o no, mas não será visivel para o objeto pai, somente no momento de serializacao. Pois a API adiciona em uma pilha de alteracao que será usada na serializacao 

    String newXmlContent = XmlUtil.serialize(parsePath) 
    GPathResult newParsePath = new XmlSlurper().parseText(newXmlContent) 
    int newSize = newParsePath.children().size() 

    assertNotNull(this.parsePath) 
    assertEquals(2, oldSize) 
    assertEquals(1, newSize) 
    assertTrue(newSize < oldSize) 
    assertNotNull(body)