首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xmlslurper节点删除问题

xmlslurper节点删除问题
EN

Stack Overflow用户
提问于 2016-06-10 07:06:32
回答 2查看 774关注 0票数 0

我有一个xml,我希望从中删除一些节点。我使用的想法是遍历所有根节点的子节点,并继续将那些我不需要删除的节点写入另一个文件。

我看到的一个问题是:节点属性在写入的文件中重新排序,这是我不想要的

我的代码看起来像这样:

代码语言:javascript
复制
def xml = new XmlSlurper(false, false).parse(args[0])
ant.delete(file:fileName)
File f = new File(fileName)
xml.children().each{
     String str = it.@name
     if(some condiotion == false)
        f << groovy.xml.XmlUtil.serialize(it)

}

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

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
EN

回答 2

Stack Overflow用户

发布于 2016-06-10 07:49:06

问题中没有xml的具体示例。下面是一个删除Node的示例:

代码语言:javascript
复制
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 )

在上面的示例中,通过执行depthFirst搜索并迭代每个节点,最后使用带有空闭包的replaceNode来删除Teachers节点。我希望这可以作为你想要的逻辑。

PS:为简洁起见,我省略了文件操作。

票数 0
EN

Stack Overflow用户

发布于 2018-02-01 20:39:45

该应用程序接口与replacementStack一起工作。因此,replaceNode {}将仅在序列化节点时显示结果,如下所示:

代码语言:javascript
复制
    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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37737575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档