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();
获取命名空间信息
我们已从 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();