Xml 文档可能会在其根元素中显示命名空间前缀声明。由于我是 StaxMate 的新手,我设法处理了元素和元素属性的 xml 输入事件。但是,我从未收到命名空间事件。
<?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>
在处理元素 myRoot 时,如何获取 xmlns 命名空间? 例如,为了将它们中的一些输出到 SMOutputDocument 的根元素?
通过实验发现。下面是一个 - 有点无用 - 复制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);
}
}