我目前正在开发具有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)
从上面的错误消息中,很明显,由于在运行时未找到DOM 3级API,因此getTextContent方法引起了异常。如何消除此错误?我猜我将不得不弄清楚哪个jar包含DOM API,并从该jar中删除所有与dom相关的类,以便代替使用与jdk一起提供的默认DOM API。或者,是否有一种方法可以使用DOM而不依靠getTextContent方法来获取xml标记的文本内容?
看起来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您可以遍历所有子节点并从所有类型为text的节点附加值。
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公开它们。