使用groovy删除具有命名空间的特定xml节点

时间:2016-03-06 11:37:47

标签: xml groovy xml.modify

使用remove xml尝试groovy个节点。这里要删除requiredByDate元素,该元素多次出现并且具有带前缀的namcespace。

查看网上可用的许多示例,以及堆栈。其中一些很接近。如果该xml元素没有命名空间,则获取所需的输出。


问题是 xml元素具有命名空间并且无法实现预期的输出。

以下是我正在尝试的groovy脚本:

import groovy.xml.*
def x='''<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://www.example/test/commontypes" xmlns:ord="http://www.example/test/orderservice" xmlns:ord1="http://www.example/test/order">
   <soapenv:Header/>
   <soapenv:Body>
         <ord:orderRequest>
            <ord1:orderRef>${#TestCase#ORDERREF}</ord1:orderRef>
            <ord1:header>
               <ord1:description>user test</ord1:description>
               <ord1:customerID></ord1:customerID>
               <ord1:requiredByDate>2010-02-02T12:00:00-07:00</ord1:requiredByDate>               
            </ord1:header>
            <ord1:line>
               <ord1:lineNumber>1</ord1:lineNumber>
               <ord1:actionMode>mode1</ord1:actionMode>
               <ord1:requiredByDate>2010-02-02T12:00:00-07:00</ord1:requiredByDate>
            </ord1:line>
            <ord1:line>
               <ord1:lineNumber>2</ord1:lineNumber>
               <ord1:action>userAction</ord1:action>
               <ord1:requiredByDate>2010-02-02T12:00:00-07:00</ord1:requiredByDate>
            </ord1:line>
         </ord:orderRequest>
   </soapenv:Body>
</soapenv:Envelope>'''
def xml=new XmlParser().parseText(x)
def nodes = xml.'**'.findAll{ it.name() == 'requiredByDate' }
nodes.each{it.parent().remove(it)}
XmlUtil.serialize(xml).toString()

输出与输入相同,即不删除requiredByDate元素(在xml中出现3次)

如果我使用命名空间硬编码,即'ord1:requiredByDate',则需要输出。在此处提及xml.'**'.findAll{ it.name() == 'ord1:requiredByDate' }

但是,我不知道在运行时期间xml中有什么前缀。因此,不能使用上面findAll中的硬编码前缀。

1 个答案:

答案 0 :(得分:1)

具有命名空间的节点为其QName方法返回name()。您可以访问&#34; local&#34;使用方法QName.getLocalPart()

的节点名称,不带名称空间

试试这个:

def nodes = xml.'**'.findAll{ it.name().localPart == 'requiredByDate' }

请参阅QName

Node的javadoc:

  

通常名称是String,值是String或   其他节点的列表,虽然类型是可扩展的,以提供   柔性结构,例如您可以使用QName作为名称   包括名称空间URI和本地名称