web-dev-qa-db-ja.com

Java XML:ClassCastException DeferredTextImpl

これが私のコードです:

// get the factory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

try {

    // Using factory get an instance of document builder
DocumentBuilder db = dbf.newDocumentBuilder();

// parse using builder to get DOM representation of the XML file
    dom = db.parse(file);

} catch (ParserConfigurationException pce) {
    pce.printStackTrace();
} catch (SAXException se) {
    se.printStackTrace();
} catch (IOException ioe) {
    ioe.printStackTrace();
}

NodeList n1 = dom.getChildNodes();
Element e1 = (Element) n1.item(0);

System.out.println(n1.getLength());
System.out.println(e1.getNodeName());

NodeList n2 = n1.item(0).getChildNodes();
Element e2 = (Element) n2.item(0);   //Line 61

System.out.println(n2.getLength());
System.out.println(e2.getNodeName());

これが私のXMLファイルです:

<?xml version="1.0" encoding="utf-8"?>

<test-fw:test
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:test-fw="http://simitar/test-fw"> 

<rule-tree>
<rule class="matchlines">
<property name="contiguous"> true</property>
<property name="inOrder">false</property>
<property name="exact">false</property>
<property name="lines">modelInstantiated</property>
</rule>
<rule class="matchlines">
<property name="contiguous"> true</property>
<property name="inOrder">true</property>
<property name="exact">false</property>
<property name="lines">InitEvent</property>
</rule>
</rule-tree>

</test-fw:test>

これが私の出力です:

1
test-fw:test
Exception in thread "main" Java.lang.ClassCastException: com.Sun.org.Apache.xerces.internal.dom.DeferredTextImpl cannot be cast to org.w3c.dom.Element
    at testpack.Main.run(Main.Java:61)
    at testpack.Main.main(Main.Java:86)

このエラーが発生し続けます。私は完全に迷子になっています。どうしたらいいのかわからない。 1つのノードを作成し、そのすべての子を取得して配列またはリストに配置できるようにしたいので、それらを反復処理できます。

これが私のすべての輸入品です:

import Java.io.File;
import Java.io.IOException;
import Java.util.List;
import Java.util.Stack;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

このXMLファイルを解析するためにこのJavaを取得するのに最も苦労しました。

8
Rob Avery IV
NodeList n1 = dom.getChildNodes();
Element e1 = (Element) n1.item(0);

ノードはElementではなく、Nodeです。

これを試して:

Node no1 = (Node) n1.item(0);

ノードは、たとえば、テキストノードまたは要素にすることができます。特に、

<root>
<element/>
</root>

4ノードです。 rootelement\nを含むテキストノードelementelementおよび別のテキストノードを含む\n

14
Anony-Mousse

NodeElementであるかどうかを確認する必要があります。 NodeElementに変換する方法は次のとおりです。

NodeList nodes = root.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
    if(nodes.item(i).getNodeType() == Node.ELEMENT_NODE){
         Element element = (Element) nodes.item(i);
         ............................
    }
}
4

NodeList.itemNodeオブジェクトを返すことに注意してください。これは、Elementである必要はありません。

あなたの場合、メソッドはテキストノードを表す DeferredTextImpl インスタンスを返します。このクラスは DeferredNode インターフェースを実装します。これは、 Node のサブインターフェースです。

Nodeインスタンスを処理するには、キャストを安全に実行できることを確認する必要があります。 Nodeインターフェースは、ノードのタイプをチェックできるメソッドを提供します getNodeType これは、比較できるshort値を返します。 ELEMENT_NODE のようなまったく同じインターフェースで定義された定数

4
toniedzwiedz