8

这是我的代码:

// 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)

我不断收到此错误。我完全迷路了。我不知道该怎么做。我希望能够拥有一个节点,并且能够获取它的所有子节点并将它们放入数组或列表中,这样我就可以遍历它们。

这是我所有的进口:

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;

我一直在努力让这个 Java 解析这个 XML 文件。

4

3 回答 3

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

该节点不是一个Element,而是一个Node

尝试这个:

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

例如,节点可以是文本节点或元素。尤其是,

<root>
<element/>
</root>

4个节点。一个root 元素,一个包含的文本节点\n,该element 元素和另一个包含的文本节点\n

于 2012-11-08T19:51:57.210 回答
4

只需要检查Nodeis an Elementor not 。以下是转换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);
         ............................
    }
}
于 2013-05-19T08:09:06.213 回答
4

请注意,它NodeList.item返回一个Node对象,它可以但不必是Element.

在您的情况下,该方法返回一个DeferredTextImpl实例,该实例表示一个文本节点。该类实现了DeferredNode接口,而该接口又是Node.

为了处理Node实例,您必须确保可以安全地执行转换。该Node接口提供了允许您检查节点类型的方法,该节点getNodeType返回一个short值,您可以将其与同一接口中定义的常量进行比较,例如ELEMENT_NODE

于 2012-11-08T20:01:16.253 回答