2011-09-12 3 views
2

네임 스페이스가있는 BPEL 관리 API 응답을 구문 분석하려고합니다. 나는 그들 모두를보고 그것을 표시하고 싶지 않습니다.Groovy XML 매번 변경되는 네임 스페이스를 사용하여 구문 분석

따라서 구문 분석을 시작하기 전에 XML에서 선언 된 모든 네임 스페이스를 즉시 수집하려고합니다.

Groovy를 통해 문서에서 선언 된 모든 XML 네임 스페이스를 얻는 방법은 무엇입니까? 사용하는 네임 스페이스의 목록을 얻을 수

답변

3

한 가지 방법은 각 요소를 방문하여 얻을 수있는 이름 공간 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

관련 문제