네임 스페이스가있는 BPEL 관리 API 응답을 구문 분석하려고합니다. 나는 그들 모두를보고 그것을 표시하고 싶지 않습니다.Groovy XML 매번 변경되는 네임 스페이스를 사용하여 구문 분석
따라서 구문 분석을 시작하기 전에 XML에서 선언 된 모든 네임 스페이스를 즉시 수집하려고합니다.
Groovy를 통해 문서에서 선언 된 모든 XML 네임 스페이스를 얻는 방법은 무엇입니까? 사용하는 네임 스페이스의 목록을 얻을 수
네임 스페이스가있는 BPEL 관리 API 응답을 구문 분석하려고합니다. 나는 그들 모두를보고 그것을 표시하고 싶지 않습니다.Groovy XML 매번 변경되는 네임 스페이스를 사용하여 구문 분석
따라서 구문 분석을 시작하기 전에 XML에서 선언 된 모든 네임 스페이스를 즉시 수집하려고합니다.
Groovy를 통해 문서에서 선언 된 모든 XML 네임 스페이스를 얻는 방법은 무엇입니까? 사용하는 네임 스페이스의 목록을 얻을 수
한 가지 방법은 각 요소를 방문하여 얻을 수있는 이름 공간 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으로 너무 오래 요소/속성 이름은 고유 당신이 일반적으로 전혀 네임 스페이스에 대해 걱정할 필요가 없습니다, 문서를 탐색 할 네임 스페이스 선언을 필요로하지 않습니다.
솔루션 및 설명을 제공해 주셔서 감사합니다. 나는 그것을 좋아한다. – karthi