You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建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规范:
    1. 必须支持DOM Level 2及以上:Level 2才正式引入命名空间支持,getLocalName()是Level 2的标准方法,Level 1 DOM没有这个方法,返回null是预期行为,但DominoTree不兼容这种情况。
    2. 所有带名称的节点(元素、属性)必须正确填充命名空间相关属性:属性节点即使没有前缀,也应返回空字符串而非null作为localName;若属性属于某个命名空间,还需正确返回getNamespaceURI()。
  • 修复建议:更换符合DOM Level 2+规范的构建器(如Xerces、JDK内置的DocumentBuilderFactory配置为命名空间感知模式),确保生成的DOM节点中属性的localName不为null。

内容的提问来源于stack exchange,提问作者jmashalk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:15:32