创建DominoTree的DOM要求及转换时NullPointerException问题咨询
Saxon DominoTree DOM兼容性问题排查与解答
我们正在开发代码,将DOM转换为Domino后调用Saxon库处理XQuery表达式(涉及构造XML文档输出)。使用部分DOM构建器创建的DOM时,抛出如下NullPointerException异常:
java.lang.NullPointerException at net.sf.saxon.om.NameOfNode.equals(NameOfNode.java:177) at net.sf.saxon.om.SingletonAttributeMap.put(SingletonAttributeMap.java:69) at net.sf.saxon.om.NodeInfo.attributes(NodeInfo.java:528) at net.sf.saxon.tree.util.Navigator.copy(Navigator.java:673) at net.sf.saxon.om.NodeInfo.copy(NodeInfo.java:568) at net.sf.saxon.tree.util.Navigator.copy(Navigator.java:679) at net.sf.saxon.om.NodeInfo.copy(NodeInfo.java:568) at net.sf.saxon.event.ComplexContentOutputter.decompose(ComplexContentOutputter.java:860) at net.sf.saxon.event.ComplexContentOutputter.append(ComplexContentOutputter.java:656)
经排查,问题根源是Domino中属性类型节点的node.getLocalName()返回null;但将DOM转换为Tiny Tree或通过DOMWrapper传递给Saxon时,该配置可正常运行。现咨询:创建DominoTree是否对DOM有特定要求?比如是否必须支持命名空间,或是必须使用Level 2 DOM构建器?
- DominoTree对DOM的核心要求:DominoTree依赖DOM节点严格遵循XML命名空间规范,尤其是属性节点必须正确返回
localName(不能为null)。Saxon在处理属性时会通过NameOfNode.equals比较节点名称,若localName为null会直接触发NPE。 - 与Tiny Tree/DOMWrapper的差异:Tiny Tree是Saxon原生的内存高效树结构,会自动补全命名空间相关的缺失信息;DOMWrapper则对原始DOM做了一层封装,会处理
localName为null的兼容情况,所以这两种方式能规避问题。 - 必须满足的DOM规范:
- 必须支持DOM Level 2及以上:Level 2才正式引入命名空间支持,
getLocalName()是Level 2的标准方法,Level 1 DOM没有这个方法,返回null是预期行为,但DominoTree不兼容这种情况。 - 所有带名称的节点(元素、属性)必须正确填充命名空间相关属性:属性节点即使没有前缀,也应返回空字符串而非null作为
localName;若属性属于某个命名空间,还需正确返回getNamespaceURI()。
- 必须支持DOM Level 2及以上:Level 2才正式引入命名空间支持,
- 修复建议:更换符合DOM Level 2+规范的构建器(如Xerces、JDK内置的DocumentBuilderFactory配置为命名空间感知模式),确保生成的DOM节点中属性的
localName不为null。
内容的提问来源于stack exchange,提问作者jmashalk
相关产品推荐
相关产品推荐

