2011-09-12 24 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