首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用groovy删除带有命名空间的特定xml节点。

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

Stack Overflow用户
提问于 2016-03-06 11:37:47
回答 1查看 1.9K关注 0票数 2

尝试使用remove xml节点使用groovy。这里希望删除requiredByDate元素,该元素存在多次,并且具有带前缀的namcespace。

查看了许多在网络上可用的示例,以及堆栈。他们中的一些人很亲密。如果该xml元素没有命名空间,则获得所需的输出。

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

这里是我正在尝试的groovy脚本:

代码语言:javascript
复制
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中使用硬编码前缀。

EN

Stack Overflow用户

回答已采纳

发布于 2016-03-06 11:47:34

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

试试这个:

代码语言:javascript
复制
def nodes = xml.'**'.findAll{ it.name().localPart == 'requiredByDate' }

请参阅QName

或者节点的javadoc

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

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35826398

复制
相关文章

相似问题

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