Java importNode抛出org.w3c.dom.domeException:不受支持\u错误

Java importNode抛出org.w3c.dom.domeException:不受支持\u错误,java,xml,dom,saxon,Java,Xml,Dom,Saxon,我正在尝试将两个XML文档与标准Oracle JDK 7和Saxon HE合并,但我一直得到一个: org.w3c.dom.DOMException: NOT_SUPPORTED_ERR: The implementation does not support the requested type of object or operation.` 在下面带有importNode的行上(同样的情况发生在adoptNodeBTW): 我得到的是: java.lang.UnsupportedOper

我正在尝试将两个XML文档与标准Oracle JDK 7和Saxon HE合并,但我一直得到一个:

org.w3c.dom.DOMException: NOT_SUPPORTED_ERR: The implementation does not support the requested type of object or operation.`
在下面带有
importNode
的行上(同样的情况发生在
adoptNode
BTW):

我得到的是:

java.lang.UnsupportedOperationException: The Saxon DOM implementation cannot be updated
  at net.sf.saxon.dom.NodeOverNodeInfo.disallowUpdate(NodeOverNodeInfo.java:719)
  at net.sf.saxon.dom.DocumentOverNodeInfo.importNode(DocumentOverNodeInfo.java:211)
  at FooMain.main(FooMain.java:16)
谷歌搜索后,我发现Saxon显然创建了一个只读DOM,这很奇怪,因为我认为DOM和SAX的比较点之一是DOM是读写的,而SAX是只读的。

要使用Saxon合并两个文档(我不确定这到底是什么意思,但我猜是这样的),你不想摆弄DOM。只需运行以下XQuery:

<doc>{doc('a.xml'), doc('b.xml')}</doc>
{doc('a.xml'),doc('b.xml')}

首先找出您实际使用的DOM实现(查看返回的工厂)。Saxon的最新版本不提供类路径搜索将检测到的DocumentBuilderFactory,因为Saxon中的DOM类仅作为Saxon内部树结构的包装器接口提供。@MichaelKay
DocumentBuilderFactory.newInstance().getClass().getName()
给出了
org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
。那么如何确保使用Saxon DOM实现呢?您需要告诉文档生成器使用哪个工厂。请参阅,java.lang.ClassLoader)Saxon的DOM实现只是为查询或转换的结果提供一个DOM API。它不允许您以编程方式创建DOM。如果您想这样做,请使用Xerces。另一方面,要使用Saxon执行所需的合并两个文档的任务,您不希望使用DOM。
java.lang.UnsupportedOperationException: The Saxon DOM implementation cannot be updated
  at net.sf.saxon.dom.NodeOverNodeInfo.disallowUpdate(NodeOverNodeInfo.java:719)
  at net.sf.saxon.dom.DocumentOverNodeInfo.importNode(DocumentOverNodeInfo.java:211)
  at FooMain.main(FooMain.java:16)
<doc>{doc('a.xml'), doc('b.xml')}</doc>