问题
Here is my code:
// 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());
Here is my XML file:
<?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>
Here is my output:
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)
I keep getting this error. I am completely lost. I have no idea what to do. I want to able to have one node, and be able to grab all it's children and put them into an array or list, so I can iterate through them.
Here are all my imports:
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;
I've had the hardest time trying to get this Java to parse this XML file.
回答1:
NodeList n1 = dom.getChildNodes();
Element e1 = (Element) n1.item(0);
The node is not an Element
, but a Node
.
Try this:
Node no1 = (Node) n1.item(0);
Nodes can be text nodes or elements, for example. In particular,
<root>
<element/>
</root>
is 4 nodes. A root
element, a text node containing \n
, the element
element and another text node containing \n
.
回答2:
Notice that NodeList.item
returns a Node
object, which can but does not have to be an Element
.
In your case, the method returns a DeferredTextImpl instance, which represents a text node. This class implements the DeferredNode interface, which is, in turn, a subinterface of Node.
In order to process the Node
instances, you'll have to make sure you can safely perform the cast. The Node
interface provides methods that allow you to check the type of a node getNodeType, which returns a short
value that you can compare to the constants defined in the very same interface like ELEMENT_NODE
回答3:
Just need to check the Node
is an Element
or not . Following is the way to convert Node
into Element
.
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);
............................
}
}
来源:https://stackoverflow.com/questions/13296583/java-xml-classcastexception-deferredtextimpl