【问题标题】:importNode throws org.w3c.dom.DOMException: NOT_SUPPORTED_ERRimportNode 抛出 org.w3c.dom.DOMException: NOT_SUPPORTED_ERR
【发布时间】:2013-10-12 17:09:38
【问题描述】:

我正在尝试将两个 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 也会发生同样的事情):

import java.io.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;

public class FooMain {

    private static Document slurp(String s) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        return factory.newDocumentBuilder().parse(new ByteArrayInputStream(s.getBytes("UTF-8")));
    }

    public static void main(String args[]) throws Exception {
        Document doc  = slurp("<a></a>");
        Document doc2 = slurp("<b></b>");
        Node not_used = doc.importNode(doc2, true);
    }
}

我已经在我的类路径上尝试了Saxon-HE-9.4.jar,但我仍然遇到同样的错误。

更新

根据我收到的 cmets,当我尝试使用时:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance("net.sf.saxon.dom.DocumentBuilderFactoryImpl", null);

我得到了:

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)

在谷歌搜索后,我看到old messages 的意思是 Saxon 显然创建了一个只读 DOM,这很奇怪,因为我认为 DOM 与 SAX 的比较点之一是 DOM 是可读写的,而 SAX 是可读写的仅限。

【问题讨论】:

  • 首先找出您实际使用的 DOM 实现(查看返回的工厂。)最近发布的 Saxon 不提供将被类路径搜索检测到的 DocumentBuilderFactory,因为 DOM 类在Saxon 仅作为 Saxon 内部树结构的包装接口提供。
  • @MichaelKay DocumentBuilderFactory.newInstance().getClass().getName() 给了org.apache.xerces.jaxp.DocumentBuilderFactoryImpl。那么如何确保使用 Saxon DOM 实现呢?
  • 您需要告诉文档生成器使用哪个工厂。见docs.oracle.com/javase/7/docs/api/javax/xml/parsers/…,java.lang.ClassLoader)
  • Saxon 的 DOM 实现只是为查询或转换的结果提供 DOM API。它的设计目的不是让您以编程方式创建 DOM。如果您想这样做,请使用 Xerces。另一方面,要使用 Saxon 执行合并两个文档的所需任务,您不想使用 DOM。

标签: java xml dom saxon


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这样做

    Node node = doc.importNode(doc2.getDocumentElement(), true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 2010-11-16
      • 2010-12-21
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      相关资源
      最近更新 更多