2011-09-12 16 views
2

名前空間を持つBPEL管理APIの応答を解析しようとしています。私はそれらをすべて見て、それをマークしたくありません。Groovy XML毎回変更されている名前空間の解析

これから解析する前に、宣言されているすべてのネームスペースをXMLの中で即座に収集したいと思います。

文書で宣言されたXML名前空間をすべてGroovy経由で取得する方法はありますか?

答えて

3

使用される名前空間のリストを取得する1つの方法は、各要素を訪問し、名前空間URIを取得することです:

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 

もう一つの方法は、GPathResultクラスの保護namespaceTagHintsプロパティにアクセスするためにリフレクションを使用することですこれはのスーパークラスです。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

関連する問題