加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy XmlSlurper:获取具有关联命名空间的属性的值

发布时间:2020-12-14 16:28:49 所属栏目:大数据 来源:网络整理
导读:我有一个 XML文档,其中包含具有限定名称的属性.我想使用XmlSlurper获取属性值,但尝试访问该属性而不指定命名空间不起作用(下面是一个最小的例子). def rootNode = new XmlSlurper().parseText('''root xmlns:ex="http://example.com" one ex:a1="uno!"/ ex:t
我有一个 XML文档,其中包含具有限定名称的属性.我想使用XmlSlurper获取属性值,但尝试访问该属性而不指定命名空间不起作用(下面是一个最小的例子).

def rootNode = new XmlSlurper().parseText(
'''<root xmlns:ex="http://example.com">
     <one ex:a1="uno!"/>
     <ex:two>Some text!</ex:two>
   </root>''' )

assert rootNode.one[0].@a1.text() == 'uno!'

rootNode.one [0].@ a1.text()将产生一个空字符串.如果使用rootNode.one [0].’@ ex:a1′.text(),我们得到正确的值,但这取决于文档中使用的名称空间前缀 – 并且不能依赖它们是相同的对于其他文档,关联的命名空间是重要的.

所以问题是:
如何使用XmlSlurper来访问具有关联命名空间的属性的属性值,而无需指定命名空间前缀?
(如果需要提供整个命名空间,那就没关系)

解决方法

我认为如果不指定这样的命名空间,就无法访??问具有关联命名空间的属性.否则,只有“名称的本地部分”将用于保存属性的地图,导致像 this old bug (groovy 1.7.5)这样的情况.

也许最好的方法是使用groovy.xml.Namespace并使用它来访问属性:

import groovy.xml.Namespace

def xml = '''
<root xmlns:ex="http://example.com">
    <one ex:a1="uno!"/>
    <ex:two>Some text!</ex:two>
</root>'''
def ns = new Namespace('http://example.com','ex')

def slurper = new XmlSlurper(false,true)
def slurped = slurper.parseText(xml)
assert 'uno!' == slurped.one[0].attributes()[ns.a1.toString()]

def parser = new XmlParser(false,true)
def parsed = parser.parseText(xml)
assert 'uno!' == parsed.one[0].attributes()[ns.a1]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读