ngong
ngong

Reputation: 862

How to get (and output) namespace prefix declarations using staxmate

Xml documents may show namespace prefix declarations in their root element. As I am new to StaxMate I managed to process xml input events for elements and element attributes. However, I never got a Namespace event.

<?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>

When processing the element myRoot how to get the xmlns namespaces? E.g. in order to output some of them to the root element of the SMOutputDocument?

Upvotes: 1

Views: 558

Answers (1)

ngong
ngong

Reputation: 862

Found out by experimenting. Following is a - somewhat useless - operation to copy an XML document, including all namespace declarations. Its purpose here is to exemplify how to cope with namespaces in StaxMate.

It is called once with a SMOutputDocument as SMOutputContainer. The cursor points to root element for the output.

After that it recursively explores and copies all elements found.

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);
    }

}

Upvotes: 1

Related Questions