2017-01-22 7 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として1回呼び出されます。カーソルは、出力のルート要素を指します。

その後、見つかったすべての要素を再帰的に探索してコピーします。あなたは絶対に同じ名前空間宣言を保持する場合を除き、名前空間を事前に宣言する必要はありません

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のバインディングを使用するかもしれないが、単にコピーする要素と属性は、十分です。接頭辞の選択は任意です(すべての要素/属性名の比較はURIとローカル名に基づいており、接頭辞は単なるショートカットではありません)が、XML処理では違いはありませんが、場合によっては、 to-URLバインディング。 – StaxMan

+0

1つのコメント: 'addElement(String localName)'の使用は、バインドされていない名前空間を想定しているため、必ずしもうまく動作するとは限りません。完全修飾名を取得するには、 'getQName()'を使う必要があります。 – StaxMan

関連する問題