gpt4 book ai didi

xml - Groovy XML 解析,命名空间每次都在变化

转载 作者:行者123 更新时间:2023-12-04 06:14:51 25 4
gpt4 key购买 nike

我正在尝试解析具有命名空间的 BPEL 管理 API 响应。我不想看到它们然后标记它。

因此,在开始解析它之前,我想即时收集 XML 中所有声明的命名空间。

如何通过 Groovy 获取文档中所有声明的 XML 命名空间?

最佳答案

获取使用的命名空间列表的一种方法是访问每个元素并获取 namespaceURI:

def s = """
<?xml version="1.0" encoding="utf-8"?>
<b:root xmlns:a="http://a.example.com" xmlns:b="http://b.example.com" xmlns:c="http://c.example.com" xmlns:d="http://d.example.com">
<a:name>Test A</a:name>
<b:name>Test B</b:name>
<b:stuff>
<c:foo>bar</c:foo>
<c:baz>
<d:foo2/>
</c:baz>
</b:stuff>
<nons>test</nons>
<c:test/>
</b:root>
""".trim()

def xml = new XmlSlurper().parseText(s)

def namespaceList = xml.'**'.collect { it.namespaceURI() }.unique()

assert ['http://b.example.com',
'http://a.example.com',
'http://c.example.com',
'http://d.example.com',
""] == namespaceList

另一种方法是使用反射访问 protected 命名空间标签提示 GPathResult 类的属性,它是 groovy.util.slurpersupport.NodeChild 的父类(super class)。
def xml = new XmlSlurper().parseText("<...>")
def xmlClass = xml.getClass()
def gpathClass = xmlClass.getSuperclass()
def namespaceTagHints = gpathClass.getDeclaredField("namespaceTagHints")
namespaceTagHints.setAccessible(true)
println namespaceTagHints.get(xml)
// returns ==> [b:http://b.example.com, a:http://a.example.com, d:http://d.example.com, c:http://c.example.com]

请注意,默认情况下 XmlSlurper 不需要命名空间声明来导航文档,因此只要元素/属性名称是唯一的,您通常根本不必担心命名空间。

关于xml - Groovy XML 解析,命名空间每次都在变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7385303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com