TinyTree.getNamespaceBindings() 失败

TinyTree.getNamespaceBindings() failing

我们已从 Saxon EE 9 升级到 10.1。下面一行代码:

    private void declareNameSpaces(XdmNode xmlRootNode, XPathCompiler xPath) {
        NamespaceBinding[] namespaceBindings = ((TinyDocumentImpl) xmlRootNode.getUnderlyingValue()).getTree().getNamespaceBindings();

Throws the exception:

    Caused by: java.lang.UnsupportedOperationException
        at net.sf.saxon.tree.tiny.TinyTree.getNamespaceBindings(TinyTree.java:1642)
        at net.windward.datasource.xml.SaxonDataSource.declareNameSpaces(SaxonDataSource.java:395)

What do we need to do differently?

The entire code in case you need it is:

private void declareNameSpaces(XdmNode xmlRootNode, XPathCompiler xPath) {
    NamespaceBinding[] namespaceBindings = ((TinyDocumentImpl) xmlRootNode.getUnderlyingValue()).getTree().getNamespaceBindings();

    List<String> prefixes = new ArrayList<String>();

    for (NamespaceBinding namespaceBinding : namespaceBindings) {
        if (namespaceBinding == null)
            break;
        String prefix = namespaceBinding.getPrefix();
        if (prefix == null || prefix.isEmpty()) {//use default prefix if prefix is empty.
            prefix = defaultPrefix;

            // make sure the prefix is unique
            while (prefixes.contains(prefix)) {
                if (Character.isDigit(prefix.charAt(prefix.length() - 1)))
                    prefix = prefix.substring(0, prefix.length() - 1) + String.valueOf((int) prefix.charAt(prefix.length() - 1) + 1);
                else
                    prefix = prefix + '1';
            }
            prefixes.add(prefix);
        }
        String uri = namespaceBinding.getURI();
        if (uri != null && !uri.isEmpty()) {
            xPath.declareNamespace(prefix, namespaceBinding.getURI());
            prefixNamespaceMap.put(prefix, namespaceBinding);
            uriToPrifixeMap.put(namespaceBinding.getURI(), prefix);
        }
    }
}

您在此处使用我们 class 作为“系统编程接口”的内容,这些接口可能会从一个主要版本更改为另一个版本。 NodeInfo 接口上命名空间表示的整个区域在 10.0 中发生了显着变化 - 有关更多详细信息,请参阅文档的“更改”部分。该模型现在更接近 XDM 规范,仅显示节点的范围内名称空间,而不是“声明”(即与父节点的差异)。

我真的不知道你的代码试图实现什么,尤其是它似乎在查看文档节点的命名空间绑定,它总是空的。

一般来说,对于 10.0,您应该使用 NamespaceMap getAllNamespaces();

获取命名空间信息