2012-11-08 15 views
6

Ecco il mio codice: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()); 

Ecco il mio file 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> 

Qui è la mia uscita:

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) 

Continuo a ricevere questo errore . Sono completamente perso. Non ho idea di cosa fare. Voglio riuscire ad avere un nodo, ed essere in grado di prendere tutti i suoi figli e metterli in un array o in una lista, così posso scorrere attraverso di loro.

Ecco tutte le mie importazioni:

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; 

che ho avuto il momento più difficile cercando di ottenere questo Java per analizzare questo file XML.

+0

si prega di inviare le vostre importazioni, pensate di aver perso qualcosa lì. – Frank

+0

Quale linea è la linea 61? –

+0

Sarebbe utile se tu indicassi quale linea del tuo snippet è la linea 61. – cjstehno

risposta

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

Il nodo non è un Element, ma un Node.

Prova questa:

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

nodi possono essere nodi di testo o elementi, per esempio. In particolare,

<root> 
<element/> 
</root> 

è nodi. Un rootelemento, un nodo testo contenente \n, il elementelemento e un altro nodo testo contenente \n.

+0

Ho cambiato gli elementi in nodi, ma è ancora mi dà la risposta sbagliata. Invece, delle eccezioni, produrrà questo: 1 \ ntest-fw: test \ n3 \ n # text –

+0

sei consapevole del fatto che le nuove righe produrranno nodi di testo tra i tuoi elementi? Il tuo primo nodo è il ** newline ** tra "" e "". Che è una stringa di lunghezza 1, contenente '\ n'. –

+0

Quindi, immagino che quando esce il #text, questo è il \ n? –

3

Si noti che NodeList.item restituisce un oggetto Node, che può ma non deve essere un Element.

Nel tuo caso, il metodo restituisce un'istanza DeferredTextImpl, che rappresenta un nodo di testo. Questa classe implementa l'interfaccia DeferredNode, che è a sua volta una subinterfaccia di Node.

Per elaborare le istanze Node, è necessario accertarsi di poter eseguire il cast in sicurezza. L'interfaccia Node fornisce i metodi che consentono di controllare il tipo di un nodo getNodeType, che restituisce un valore short che è possibile confrontare le costanti definite nella stessa interfaccia come ELEMENT_NODE

+0

Cosa farebbero queste due linee? dbf.setNamespaceAware (true); dbf.setValidating (dtdValidate || xsdValidate); –

+0

Il primo ('dbf.setNamespaceAware (true);') consente al parser di prendere in considerazione [namespace XML] (http://en.wikipedia.org/wiki/XML_namespace). Per dirla semplicemente, gli spazi dei nomi consentono di differenziare gli elementi con gli stessi nomi e definizioni diverse. Un elemento 'cat' può significare cose completamente diverse in un documento che descrive gli animali e in un documento sui comandi della shell. Grazie agli spazi dei nomi, ognuno può definire i propri elementi, la propria struttura e nominarli a loro piacimento. – toniedzwiedz

+0

Come per il secondo ('dbf.setValidating (dtdValidate || xsdValidate);'), è possibile incorporare [Document Type Definitions] (http://en.wikipedia.org/wiki/Document_Type_Definition) nei documenti XML. Se viene fornita tale definizione, è possibile non solo verificare se un documento è [ben formato] (http://en.wikipedia.org/wiki/Well-formed_element) ma segue anche uno schema specifico. L'impostazione della proprietà 'validating' su' true' fa sì che il parser verifichi la conformità con una DTD incorporata (se presente) e non solo per la ben strutturata. – toniedzwiedz

4

solo bisogno di controllare la Node è un Element o no . Di seguito è riportato il modo per convertire Node in 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); 
     ............................ 
    } 
} 
Problemi correlati