我目前正在开发使用XMLBeans绑定而不是默认JAXB绑定的Apache CXF Web服务。我正在使用Java 1.6编译和运行代码。 我在运行时遇到以下代码片段的“DOM Level 3 Not implemented”错误:
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方法很明显会导致exexception,因为在运行时找不到DOM 3级API。如何消除此错误?我猜我必须找出哪个jar包含DOM API并从该jar中删除所有dom相关类,以便使用与jdk一起出现的默认DOM API。或者,有没有办法在不依赖getTextContent方法的情况下使用DOM获取xml标记的文本内容?
答案 0 :(得分:4)
似乎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公开它们。
答案 1 :(得分:0)
根据this page,Java 6的XML支持应该符合DOM 3。另请参阅Java SE 6 javadoc。
这让我觉得你在JBoss上运行它的应用程序必须在类路径上有更旧的XML jar,或类似的东西。
答案 2 :(得分:0)
仅供参考:这通常是由maven或类似路径添加非常旧的xml-apis或xmlParserApis jars引起的,通常是通过xerces依赖项,这些可以删除,Java已经内置了多年的XML。现代Java代码永远不应该依赖于xerces。