2012-11-08 4 views
6

Voici mon code: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()); 

Voici mon fichier 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> 

Voici ma sortie:

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) 

Je continue à obtenir cette erreur . Je suis complètement perdu. Je n'ai aucune idée de ce qu'il faut faire. Je veux pouvoir avoir un nœud, et être capable de saisir tous ses enfants et les mettre dans un tableau ou une liste, afin que je puisse les parcourir.

Voici toutes mes importations:

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; 

J'ai eu le plus de temps à essayer d'obtenir ce Java pour analyser ce fichier XML.

+0

veuillez poster vos importations, pensez que vous avez manqué quelque chose. – Frank

+0

Quelle ligne est la ligne 61? –

+0

Il serait utile que vous indiquiez quelle ligne de votre extrait est la ligne 61. – cjstehno

Répondre

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

Le noeud est pas un Element, mais un Node.

Essayez ceci:

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

nœuds peuvent être des noeuds de texte ou des éléments, par exemple. En particulier,

<root> 
<element/> 
</root> 

est noeuds. A rootélément, un noeud de texte contenant \n, l'élément element et un autre noeud de texte contenant \n.

+0

Je change les éléments en nœuds, mais cela me donne toujours la mauvaise réponse. A la place, des exceptions, il sortira ceci: 1 \ ntest-fw: test \ n3 \ n # texte –

+0

vous savez que les nouvelles lignes vont produire des nœuds de texte entre vos éléments? Votre premier noeud est le ** newline ** entre '' et ''. Qui est une chaîne de longueur 1, contenant '\ n'. –

+0

Donc, je devine que lorsque le #text sort, c'est le \ n? –

3

Notez que NodeList.item renvoie un objet Node, qui peut mais ne doit pas être un Element.

Dans votre cas, la méthode renvoie une instance DeferredTextImpl, qui représente un nœud de texte. Cette classe implémente l'interface DeferredNode, qui est à son tour une sous-interface de Node. Pour traiter les instances Node, vous devez vous assurer que vous pouvez effectuer la distribution en toute sécurité. L'interface Node fournit des méthodes qui vous permettent de vérifier le type d'un nœud getNodeType, qui retourne une valeur short que vous pouvez comparer aux constantes définies dans la très même interface comme ELEMENT_NODE

+0

Que feraient ces deux lignes? dbf.setNamespaceAware (true); dbf.setValidating (dtdValidate || xsdValidate); –

+0

Le premier ('dbf.setNamespaceAware (true);') fait en sorte que l'analyseur prenne en compte [les espaces de noms XML] (http://en.wikipedia.org/wiki/XML_namespace). Pour le dire simplement, les espaces de noms vous permettent de différencier les éléments avec les mêmes noms et différentes définitions. Un élément 'cat' peut signifier des choses totalement différentes dans un document décrivant des animaux et dans un document sur les commandes du shell. Grâce aux espaces de noms, chacun peut définir ses propres éléments, les structurer et les nommer comme bon lui semble. – toniedzwiedz

+0

Comme pour le second ('dbf.setValidating (dtdValidate || xsdValidate);'), il est possible d'incorporer [Document Type Definitions] (http://en.wikipedia.org/wiki/Document_Type_Definition) dans les documents XML. Si une telle définition est fournie, il est possible non seulement de vérifier si un document est [bien formé] (http://en.wikipedia.org/wiki/Well-formed_element) mais suit également un schéma spécifique. En définissant la propriété 'validating' sur' true', l'analyseur vérifie la conformité à une DTD incorporée (si elle est présente) et non seulement à la bonne forme. – toniedzwiedz

4

juste besoin de vérifier l'Node Est un Element ou pas . Voici la façon de convertir Node en 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); 
     ............................ 
    } 
}