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!
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):
bar
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
.
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;
}
}
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