2017-01-22 4 views
1

Xml 문서는 루트 요소에 네임 스페이스 접두사 선언을 표시 할 수 있습니다. StaxMate를 처음 접했을 때 요소 및 요소 특성에 대한 xml 입력 이벤트를 처리했습니다. 그러나, 나는 Namespace 이벤트를 얻지 못했다.staxmate를 사용하여 네임 스페이스 접두사 선언을 가져 오는 방법 (및 출력)

<?xml version="1.0" encoding="UTF-8"?> 
<myRoot xmlns="http://myurl.com/myProject" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:mya="http://myurl.com/myAttributes" 
    xsi:schemaLocation="http://myurl.com/myProject ./../../main/xsd/mySchema.xsd "> 


    <myElement mya:myAttribute="attribute content"> 
    <mySubElement>subelements content</original> 
    </myElement> 
</myRoot> 

방법의 xmlns 네임 스페이스를 얻을 수있는 요소 myRoot을 처리 할 때? 예 : 그 중 일부를 SMOutputDocument의 루트 요소에 출력하려면?

답변

1

실험적으로 밝혀졌다. 다음은 모든 네임 스페이스 선언을 포함하여 XML 문서를 복사하는 다소 쓸데없는 작업입니다. 여기서의 목적은 StaxMate에서 네임 스페이스에 대처하는 방법을 보여주는 것입니다.

SMOutputDocument를 SMOutputContainer로 한 번 호출합니다. 커서는 출력의 루트 요소를 가리 킵니다.

그런 다음 발견 된 모든 요소를 ​​반복적으로 탐색하고 복사합니다. 당신은 당신이 절대적으로 동일한 네임 스페이스 선언을 유지하려는 경우가 아니면 네임 스페이스를 미리 선언 할 필요가 없습니다

private void processStartElement(SMInputCursor cursor, SMOutputContainer element) throws XMLStreamException { 

    SMOutputElement loe = element.addElement(cursor.getPrefixedName()); 
    // add all namespace declarationss to the element 
    for (int i = 0; i < cursor.getStreamReader().getNamespaceCount(); i++) { 
     loe.predeclareNamespace(element.getNamespace(
       cursor.getStreamReader().getNamespaceURI(i), 
       cursor.getStreamReader().getNamespacePrefix(i))); 
    } 
    for (int i = 0; i < cursor.getAttrCount(); i++) { 
     loe.addAttribute(
       element.getNamespace(cursor.getAttrNsUri(i)), 
       cursor.getAttrLocalName(i), 
       cursor.getAttrValue(i)); 
    } 
    SMInputCursor lc = cursor.childCursor(); 
    while ((lc != null) && (lc.getNext() != null)) { 
     this.processStartElement(lc, loe); 
    } 

} 
+0

참고 : 이렇게하면 다른 접두사 - 투 - 네임 스페이스 - URI 바인딩을 사용할 수 있지만 단지 복사하는 요소와 속성은 충분하다. 이것은 접두사 선택이 임의적이기 때문에 XML 처리에 차이가 없습니다 (모든 요소/속성 이름 비교는 URI와 로컬 이름을 기반으로합니다 - 어떤 접두사도 바로 가기가 아닙니다). 그러나 어떤 경우에는 동일한 접두사를 유지하는 것이 유리할 수 있습니다. to-URL 바인딩. – StaxMan

+0

한 주석 :'addElement (String localName)'의 사용은 언 바운드 네임 스페이스를 가정하므로 반드시 잘 작동하지는 않습니다. 정규화 된 이름을 얻으려면'getQName()'을 사용해야합니다. – StaxMan