2
我想解析BPEL管理API響應,它有其命名空間。我不想看到他們,然後標記它。Groovy XML分析與每次都在變化的名稱空間
因此,在開始解析它之前,我想要在XML中快速收集所有聲明的命名空間。
如何通過Groovy獲取文檔中所有聲明的XML名稱空間?習慣的命名空間的列表
我想解析BPEL管理API響應,它有其命名空間。我不想看到他們,然後標記它。Groovy XML分析與每次都在變化的名稱空間
因此,在開始解析它之前,我想要在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
另一種方法是使用反射來訪問受保護的namespaceTagHints的GPathResult類財產,它是groovy.util.slurpersupport.NodeChild的超類。
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不需要命名空間聲明瀏覽文檔,所以只要元素/屬性名稱是唯一的,你通常不必在所有擔心的命名空間。
感謝您給我解決方案和解釋。我喜歡 – karthi