【问题标题】:Why do I get a "DOM Level 3 Not implemented" error at run-time?为什么我会在运行时收到“DOM Level 3 Not implemented”错误?
【发布时间】:2012-09-26 14:20:02
【问题描述】:

我目前正在开发一个使用 XMLBeans 绑定而不是默认 JAXB 绑定的 Apache CXF Web 服务。我正在使用 Java 1.6 编译和运行代码。 我在运行时收到以下代码 sn-p 的“DOM 级别 3 未实现”错误:

ExtType[] extTypeList = p.getExtArray();
        for (ExtType extType : extTypeList) {               
            Node node = extType.getDomNode();
            NodeList objList = node.getChildNodes();
            for (int i = 0; i < objList.getLength(); ++i) {
                Node text = (Node) objList.item(i);                 
                if (text.getNodeName() != null
                        && text.getNodeName() == XmlConstant.NODE_NAME) {

                    info.setDuration(text
                            .getTextContent());
                }
            }
        }

JBoss 中显示的确切错误如下:

java.lang.RuntimeException: DOM Level 3 Not implemented
        at org.apache.xmlbeans.impl.store.DomImpl._node_getTextContent(DomImpl.java:2516)
        at org.apache.xmlbeans.impl.store.Xobj$NodeXobj.getTextContent(Xobj.java:2607)

从上面的错误消息中,很明显 getTextContent 方法导致了异常,因为在运行时找不到 DOM 级别 3 API。如何消除此错误?我猜我必须弄清楚哪个 jar 包含 DOM API,并从该 jar 中删除所有与 dom 相关的类,以便使用 jdk 附带的默认 DOM API。或者,有没有一种方法可以在不依赖 getTextContent 方法的情况下使用 DOM 获取 xml 标签的文本内容?

【问题讨论】:

    标签: java dom cxf xmlbeans


    【解决方案1】:

    根据this page,Java 6 的 XML 支持应该是 DOM 3 兼容的。另请参阅 Java SE 6 javadoc

    这让我认为,当您在 JBoss 上运行应用程序时,其类路径中必须有较旧的 XML jar,或类似的东西。

    【讨论】:

      【解决方案2】:

      看起来好像 XMLBeans 提供了一个不符合 DOM 3 的基于异常的 DOM 实现:

      java.lang.RuntimeException: DOM Level 3 Not implemented
              at org.apache.xmlbeans.impl.store.DomImpl._node_getTextContent(DomImpl.java:2516)
              at org.a
      
      pache.xmlbeans.impl.store.Xobj$NodeXobj.getTextContent(Xobj.java:2607)
      

      您可以迭代所有子节点并附加来自所有文本类型节点的值,而不是 getTextContent

      package forum12746038;
      
      import java.io.StringReader;
      import javax.xml.parsers.*;
      import org.w3c.dom.*;
      import org.xml.sax.InputSource;
      
      public class Demo {
      
          public static void main(String[] args) throws Exception {
              DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
              DocumentBuilder db = dbf.newDocumentBuilder();
              String xml = "<root>Hello <!-- comment -->World</root>";
              Document doc = db.parse(new InputSource(new StringReader(xml)));
      
              Element element = doc.getDocumentElement();
              NodeList childNodes = element.getChildNodes();
              StringBuilder strBldr = new StringBuilder();
              for(int x=0; x<childNodes.getLength(); x++) {
                  Node childNode = childNodes.item(x);
                  if(childNode.getNodeType() == Node.TEXT_NODE) {
                      strBldr.append(childNode.getNodeValue());
                  }
              }
              System.out.println(strBldr.toString());
          }
      
      }
      

      我猜我必须弄清楚哪个 jar 包含 DOM API 并从该 jar 中删除所有与 dom 相关的类,以便默认 使用 jdk 附带的 DOM API。

      这可能行不通,因为我想象 XMLBeans 返回一个专门的 DOM 实现,该实现包装了自己的对象以通过 DOM API 公开它们。

      【讨论】:

      • 如何在不使用 getTextContent 方法的情况下从节点获取值? getNodeValue 方法获取一个空值!
      • @bot - 您需要遍历包含文本节点的元素的所有子节点。然后对于每个文本类型的子节点,您需要获取该节点值并将它们连接在一起以获得字符串值。
      • 所以我需要遍历 text.getChildNodes 并检查子节点是否是文本节点,然后使用 getNodeValue 方法而不是直接调用 text.getNodeValue 来获取它的值?
      • 由于无法使用 getTextContent 或 geyNodeValue,一旦遇到文本类型的节点,我应该调用什么方法来获取节点值?
      • @bot - 我添加了一个完整的例子。
      【解决方案3】:

      仅供参考:这通常是由 maven 或将非常旧的 xml-apis 或 xmlParserApis jar 添加到类路径中引起的,通常通过 xerces 依赖项,这些可以删除,Java 已经内置了 XML 多年。现代 Java 代码不应该依赖于 xerces。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-20
        • 2012-05-31
        • 2010-09-15
        • 1970-01-01
        • 2023-03-24
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多