2011-09-12 20 views
2

我想解析BPEL管理API响应,它有其命名空间。我不想看到他们,然后标记它。Groovy XML分析与每次都在变化的名称空间

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

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

回答

3

的方法之一是访问每个元素,并获得的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不需要命名空间声明浏览文档,所以只要元素/属性名称是唯一的,你通常不必在所有担心的命名空间。

+0

感谢您给我解决方案和解释。我喜欢 – karthi