2

私は現在、デフォルトの JAXB バインディングの代わりに XMLBeans バインディングを使用した Apache CXF Web サービスの開発に取り組んでいます。Java 1.6 でコードをコンパイルして実行しています。次のコード スニペットの実行時に「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)

上記のエラー メッセージから、実行時に DOM レベル 3 API が見つからないため、getTextContent メソッドが例外を引き起こしていることは明らかです。このエラーを解消するにはどうすればよいですか? jdk に付属するデフォルトの DOM API が代わりに使用されるように、どの jar に DOM API が含まれているかを特定し、その jar からすべての dom 関連クラスを削除する必要があると思います。または、getTextContent メソッドに依存せずに DOM を使用して xml タグのテキスト コンテンツを取得する方法はありますか?

4

3 に答える 3

6

XMLBeansは、例外に基づいてDOM3に準拠していない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にDOMAPIが含まれているかを把握し、そのjarからすべてのdom関連クラスを削除して、jdkに付属するデフォルトのDOMAPIが代わりに使用されるようにする必要があると思います。

XMLBeansが独自のオブジェクトをラップしてDOMAPIを介してそれらを公開する、特殊なDOM実装を返​​すと想像するので、これはおそらく機能しません。

于 2012-10-05T13:19:08.470 に答える
0

このページによると、Java 6 の XML サポートは DOM 3 に準拠するはずです。Java SE 6 javadocも参照してください。

このことから、アプリケーションを JBoss で実行する場合、クラスパスに古い XML jar などが必要であると考えるようになります。

于 2012-10-05T12:56:18.610 に答える