Java 如何使用XdmNode从标记中读取名称空间?

Java 如何使用XdmNode从标记中读取名称空间?,java,xml,parsing,namespaces,saxon,Java,Xml,Parsing,Namespaces,Saxon,我希望从net.sf.saxon.s9api.XdmNode中的一个标记中读取所有名称空间。我可以使用下面的代码读取它们,但是由于性能问题,我应该使用现有的DOM来解析和读取名称空间 input.xml 从上面的文件中,我希望读取link:linkbase标记中的所有xmlns属性 下面的代码片段按预期工作,但影响了性能 代码 我寻找合适的工作解决方案,但没有找到 Iterator <XdmItem> itemList = document.axisIterator(Axis.CH

我希望从net.sf.saxon.s9api.XdmNode中的一个标记中读取所有名称空间。我可以使用下面的代码读取它们,但是由于性能问题,我应该使用现有的DOM来解析和读取名称空间

input.xml

从上面的文件中,我希望读取link:linkbase标记中的所有xmlns属性

下面的代码片段按预期工作,但影响了性能

代码

我寻找合适的工作解决方案,但没有找到

Iterator <XdmItem> itemList  = document.axisIterator(Axis.CHILD);
        while(itemList.hasNext()) {
            XdmItem item = itemList.next();
            System.err.println(item.getStringValue());
        }
在上面的代码中,我在XdmItem中获得了完整的link标记,但找不到读取linkbase标记和获取名称空间的方法


任何形式的帮助都将不胜感激。另外,如果需要更多信息,请告诉我。

如果我理解正确,您已经将文档作为XdmNode实例保存。如果是这种情况,那么可以使用s9api接口来执行XPath表达式

/*/namespace(*)
这将返回一个XdmValue,其中包含最外层元素上的名称空间节点列表。你就可以这么做了

for (XdmItem item : result) {
   XdmNode ns = (XdmNode)item;
   String prefix = ns.getNodeName()==null ? "" : ns.getNodeName().getLocalName();
   String uri = ns.getStringValue();
   ...
}

如果您愿意,可以通过在文档节点上使用XdmNode.axisIteratorAxis.CHILD查找最外层的元素,然后使用XdmNode.axisIteratorAxis.NAMESPACE查找命名空间节点来实现相同的效果。

即使我找到了将XdmNode转换为XMLStreamReader的方法,它将解决此问题。我使用的是XdmNode.axisIteratorAxis.CHILD或XdmNode.axisIteratorAxis.NAMESPACE,但没有考虑同时使用它们。成功了。
/*/namespace(*)
for (XdmItem item : result) {
   XdmNode ns = (XdmNode)item;
   String prefix = ns.getNodeName()==null ? "" : ns.getNodeName().getLocalName();
   String uri = ns.getStringValue();
   ...
}