Java 如何使用state获取(和输出)名称空间前缀声明

Java 如何使用state获取(和输出)名称空间前缀声明,java,xml,stax,Java,Xml,Stax,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://myur

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

}
private void processStartElement(SMInputCursor游标,SMOutputContainer元素)抛出XMLStreamException{
SMOutputElement loe=element.addElement(cursor.getPrefixedName());
//将所有命名空间声明添加到元素
对于(int i=0;i
请注意,除非您绝对希望保留相同的名称空间声明,否则不必预先声明名称空间:只需复制元素和属性就足够了,尽管这样做可能会使用不同的前缀到名称空间URI绑定。这在XML处理中没有区别,因为前缀选择是任意的(所有元素/属性名称比较都基于URI和本地名称——决不使用前缀,这只是一种快捷方式),但在某些情况下,保留相同的URL绑定前缀可能是有益的。一条注释:使用
addElement(字符串localName)
不一定能正常工作,因为它假定未绑定的名称空间。要获得完全限定名,您需要使用
getQName()