【问题标题】:Remove a specific xml node with namespace using groovy使用 groovy 删除具有命名空间的特定 xml 节点
【发布时间】:2016-03-06 11:37:47
【问题描述】:

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

查看了网上的许多示例,以及stackover。其中一些很接近。如果该 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 中的硬编码前缀。

【问题讨论】:

    标签: xml groovy xml.modify


    【解决方案1】:

    具有命名空间的节点为他的name() 方法返回一个QName。您可以使用 QName.getLocalPart() 方法访问节点的“本地”名称,而无需命名空间。

    试试这个:

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

    QName

    或者Node的javadoc:

    通常名称是字符串,值是字符串或 其他节点的列表,尽管这些类型可以扩展以提供 灵活的结构,例如您可以使用 QName 作为名称 包括命名空间 URI 和本地名称

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多