web-dev-qa-db-fra.com

java xml cast Node to Element

Je sais que cela a été demandé plusieurs fois mais je n'arrive toujours pas à le faire fonctionner. Je convertis la chaîne xml en objet Document, puis l'analyser. Voici le code:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.*;

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
try
{
  builder = factory.newDocumentBuilder();  
  Document document = builder.parse( new InputSource( new StringReader( result ) ) );
  Node head = document.getFirstChild();
  if(head != null)
  {                  
    NodeList airportList = head.getChildNodes();      
    for(int i=0; i<airportList.getLength(); i++) {
    Node n = airportList.item(i);                        
    Element airportElem = (Element)n;
  }
}
catch (Exception e) {
  e.printStackTrace();
} 

Lorsque je casse l'objet Node n à l'élément, j'obtiens une exception Java.lang.ClassCastException: org.Apache.harmony.xml.dom.TextImpl ne peut pas être converti en org.w3c.dom.Element . Lorsque je vérifie le type de nœud de l'objet Node, il indique Node.TEXT_NODE. Je pense que ce devrait être Node.ELEMENT_NODE. Ai-je raison?

Alors, comment puis-je convertir Node en Element, donc je peux faire quelque chose comme element.getAttribute ("attrName").

Voici mon XML:

<?xml version="1.0" encoding="utf-8" ?> 
<ArrayOfCity xmlns:xsd="http://www.w3.org/2001/XMLSchema"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<City>
  <strName>Abu Dhabi</strName> 
  <strCode>AUH</strCode> 
</City>
<City>
  <strName>Amsterdam</strName> 
  <strCode>AMS</strCode> 
</City>
<City>
  <strName>Antalya</strName> 
  <strCode>AYT</strCode> 
</City>
<City>
  <strName>Bangkok</strName> 
  <strCode>BKK</strCode> 
</City>
</ArrayOfCity>

Merci d'avance!

12
Student

Lorsque je casse l'objet Node n à l'élément, j'obtiens une exception Java.lang.ClassCastException: org.Apache.harmony.xml.dom.TextImpl ne peut pas être converti en org.w3c.dom.Element . Lorsque je vérifie le type de nœud de l'objet Node, il indique Node.TEXT_NODE. Je pense que ce devrait être Node.ELEMENT_NODE. Ai-je raison?

Probablement pas, l'analyseur a probablement raison. Cela signifie que certains des nœuds dans lesquels vous analysez sont nœuds de texte . Par exemple:

<foo>bar</foo>

Dans ce qui précède, nous avons un élément foo contenant un nœud de texte. (Le nœud de texte contient le texte "bar".)

De même, considérez:

<foo>
    <bar>baz</bar>
</foo>

Si votre document XML littéralement ressemble à ce qui précède, il contient un élément racine foo avec ces nœuds enfants (dans l'ordre):

  • Un nœud de texte avec des espaces
  • Un élément bar
  • Un nœud de texte avec plus d'espace en lui

Notez que l'élément bar n'est pas le premier enfant de foo. Si cela ressemblait à ceci:

<foo><bar>baz</bar></foo>

alors l'élément bar serait le premier enfant de foo.

8
T.J. Crowder

Je pense que vous avez besoin de quelque chose comme ça:

NodeList airportList = head.getChildNodes();
for (int i = 0; i < airportList.getLength(); i++) {
    Node n = airportList.item(i);
    if (n.getNodeType() == Node.ELEMENT_NODE) {
        Element elem = (Element) n;
    }
}
17
Aleksei Bulgak

vous pouvez également essayer de "protéger" votre casting

Node n = airportList.item(i);
if (n instanceof Element)
{                        
    Element airportElem = (Element)n;
    // ...
}

mais comme indiqué par d'autres, vous avez un nœud de texte, ceux-ci ne seront pas castés par cette méthode, assurez-vous que vous n'en avez pas besoin d'utiliser la condition pour avoir un code différent pour les traiter

5
Jerome Diaz