Bonjour , je suis nouveaux en développement je trouve votre code trés intéressant dans mon algorithme que je suis entrain d écrire , j'ai des problèmes avec getChildren elle ne marche pas merci d avance.
Pièce jointe 243127
Version imprimable
Bonjour , je suis nouveaux en développement je trouve votre code trés intéressant dans mon algorithme que je suis entrain d écrire , j'ai des problèmes avec getChildren elle ne marche pas merci d avance.
Pièce jointe 243127
Salut,
Il y a plusieurs problèmes dans ton code. Tout d'abord, tu ne peux pas appeler getChildren() sur un tableau : cette méthode n'existe pas sur un tableau en Java. Cela explique pourquoi tu as l'erreur que tu montres.
Mais le premier problème est dans Documen doc = (Document) parser.build("test.xml"); et l'import correspondant : javax.swing.text.Document. Cette classe corrspondant à un modèle de texte pour l'API Swing. Cela n'a rien à voir avec JDOM ni même XML. La bonne classe c'est org.jdom.Document (ou plutôt org.jdom2.Document, parce que tu devrais utiliser plutôt JDOM2 que JDOM, l'ancienne version).
D'ailleurs, il n'y a aucune raison de caster en réalité, parce que la méthode build() retourne directement un Document JDOM. Tu as été obligé de caster à cause du mauvais import : ça aurait dû te mettre la puce à l'oreille sur l'existence d'un problème déjà à ce niveau.
En conséquence getRootElements() n'existant pas sur cette classe Document, parce qu'un XML n'a de toute façon qu'un seul élément racine, il faudra la remplacer par la méthode adéquate, getRootElement(), qui retourne donc, non pas un tableau, mais un Element, Element sur lequel tu pourras appeler getChildren().
j ai ce fichier xml et je veut avoir le name de chaque evt dans le fichier dans une liste je n'arrive pas à comprendre le problème :(
aider moi SVP.
merci
Je t'ai dit quel était ton problème : il faut que tu supprimes l'import de java.swing.text.Document qui n'est pas la bonne classe.
Ensuite, pour ton problème en particulier (récupérer le nom de tous les éléments evt), ce sera plus simple d'utiliser un visiteur (ici code jdom2) :
Code:
1
2
3
4
5
6
7 List<String> evtNames = new ArrayList<>(); // une liste pour récupérer les names de evt Element root = doc.getRootElement(); ElementFilter filter = new org.jdom2.filter.ElementFilter("evt"); // un filtre qui sélectionne les éléments qui s'appellent evt for(Element c : root.getDescendants(filter)) { // récupère tous les enfants qui correspondent au filtre evtNames.add( c.getAttributeValue("name") ); // récupère l'attribut name et l'ajouter à la liste }
Je vous remercie Joel pour votre patience avec moi
j ai essayé d utiliser le code que tu as deja m envoyer
je ne sais pas ou est le probleme exactement il ya toujours ls lignes rouges :(
j ai supprimé l import que tu as deja dit mais en vain :(
Pièce jointe 243303
Oui, mais tu n'as pas lu tout ce que je t'ai envoyé :
- utilise les balises CODE et pas de copie d'écran !!!
- utilise JDOM2 et pas JDOM (téléchargeables sur le même site, au même endroit à 15 ou 16 pixels près)
Les lignes rouges sont accompagnés de messages d'erreur assez explicite pour qu'une simple lecture donne souvent la solution.
Oui mais tu l'as remplacé par org.w3c.dom.Document qui n'est ni org.jdom.Document ni org.jdom2.Document (que je t'avais dit d'utiliser).
En plus tu as importé java.awt.* et java.util.*, du coup, comme il y a un List dans les deux, Java ne sait pas lequel récupérer. Evidemment, c'est java.util.List qu'il faut.
j ai ajouté le fichier jdom2.jar , please corrige ce code je n arrive pas a comprendre les fautes que j ai deja comi :(
mercii :*
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 import java.awt.List; import java.io.File; import javax.lang.model.element.Element; import java.io.*; import org.jdom2.*; import java.util.*; import org.jdom.*; import org.jdom.filter.ElementFilter; import org.jdom.input.*; public class xmlreader { public static void main(String[] args) { try { //Lecture du fichier SAXBuilder parser = new SAXBuilder(); Document doc = (Document) parser.build("test.xml"); List<String> evtNames = new ArrayList<>(); // une liste pour récupérer les names de evt Element root = doc.getRootElement(); ElementFilter filter = new org.jdom2.filter.ElementFilter("evt"); // un filtre qui sélectionne les éléments qui s'appellent evt for(Element c : root.getDescendants(filter)) { // récupère tous les enfants qui correspondent au filtre evtNames.add( c.getAttributeValue("name") ); // récupère l'attribut name et l'ajouter à la liste } } } } }
Il faut que tu enlèves les imports qui n'ont rien à faire là (et surtout que tu n'en ajoutes pas d'autres sans faire attention à ce que tu ajoutes) :
- import java.awt.List;
C'est un composant graphique de lAPI AWT. Je t'ai déjà dit que List c'était java.util.List, donc c'est pas autre chose.- import javax.lang.model.element.Element;
Tu as fait fort pour aller le chercher celui-là ! Element, c'est une classe de JDOM, donc pas besoin d'import, avec org.jdom2 tu l'as importée. Tu fais du JDOM, donc les classes montrées dans l'exemple font logiquement partie de l'API JDOM, pas d'une autre. Sinon, la présence d'erreur (l'absence de méthode) est un bon indicateur sur le fait que tu as importé la mauvaise classe.- import org.jdom.*;
A enlever, puisque tu utilises maintenant jdom2, et a remplacer par org.jdom2.*- import org.jdom.filter.ElementFilter;
Inutile parce qu'on référence explicitement le nom complet de la classe dans le code. Mais si tu procèdes par import, c'est pareil que pour le précédent : jdom2 au lieu de jdom- import org.jdom.input.*;
Normalement tu n'as pas besoin de ça, donc supprime, mais si tu en as besoin, jdom2 au lieu de jdom aussi.
je n arrive pas a trouver une solution
j ai ajouter un file pour etre convertit en doc apres
les fautes sont diminués , merci pour votre aide
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 import java.io.File; import java.util.ArrayList; import java.util.List; import java.io.*; import org.jdom2.*; import org.jdom2.filter.ElementFilter; import org.jdom2.input.SAXBuilder; public class xmlreader { public static void main(String[] args) { SAXBuilder parser = new SAXBuilder(); File f= new File("test.xml"); Document doc = (Document) parser.build(f); List<String> evtnames= new java.util.ArrayList(); Element root = doc.getRootElement(); String evt; ElementFilter filter = new ElementFilter(); filter =ElementFilter("evt"); for(Element c : root.getDescendants(filter)) { evtnames.add( c.getAttributeValue("name") ); } } }
Pourquoi avoir modifié cette partie :
Et si tu regardais le code que je t'ai donné en exemple ?Code:
1
2 ElementFilter filter = new ElementFilter(); filter =ElementFilter("evt");
elle montre des fautes c pqoui j ai changé un peut :o
j ai des problemes dans le code au niveau de getDescendants et getAttributeValue j ai pas connu la bib :\
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.jdom2.filter.ElementFilter; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; import java.util.*; public class Main { public static void main(String[] args) throws ParserConfigurationException, Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setNamespaceAware(true); factory.setFeature("http://xml.org/sax/features/namespaces", false); factory.setFeature("http://xml.org/sax/features/validation", false); factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); try { DocumentBuilder builder =factory.newDocumentBuilder(); Document doc =builder.parse("malab.xml"); System.out.println("------------------------------------"); List<String> evtnames= new java.util.ArrayList(); Element root = (Element) doc.getDocumentElement(); String evt; ElementFilter filter = new org.jdom2.filter.ElementFilter("evt"); for(Element c : root.getDescendants(filter)) { evtnames.add( c.getAttributeValue("name") ); for (Iterator it=evtnames.iterator();it.hasNext();){ System.out.println(it.next()); } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
Tu n'utilises plus JDOM2 mais l'API standard Java (moins pratique)... pourquoi ? Evidemment, les méthodes ne sont plus les mêmes, et getDescandants, ou ElementFilter n'existent pas (il y a getElementByTagName à la place : voir la javadoc pour connaître les méthodes).
Comment je peut importer jdom2 j ai essayé import org.jdom2.*; ca ne marche pas aussi ,
ou par quoi je peut remplacer get descendants et getattributevalue ?
merci d avance
wi j ai ajouté le jar de jdom 2 , je suis sur l IDE 8
L'IDE (ou EDI en français), integrated development environment, soit l'environnement de développement, donc Eclipse, NetBeans, IntellijIdea, autre ? Ajouter le jar de jdom2 ne veut rien dire en soi. Si le jar est bien dans le classpath, il n'y aucun raison que les imports org.jdom2.* ne fonctionnent pas et que tu ne puisses pas utiliser les classes de ce package.
j utilise eclipse, j n ai aucune ligne rouge mais il ne fonctionne pas !!
c est le message d erreur que j ai: Exception in thread "main" java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredElementImpl cannot be cast to org.jdom2.Elemen at Main.main(Main.java:28)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.jdom2.Element; import org.jdom2.filter.ElementFilter; import org.w3c.dom.Document; public class Main { public static void main(String[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setNamespaceAware(true); factory.setFeature("http://xml.org/sax/features/namespaces", false); factory.setFeature("http://xml.org/sax/features/validation", false); factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); try { DocumentBuilder builder =factory.newDocumentBuilder(); Document doc =builder.parse("malab.xml"); System.out.println("------------------------------------"); List<String> evtnames= new java.util.ArrayList<>(); Element root = (Element) doc.getDocumentElement(); String evt; ElementFilter filter = new org.jdom2.filter.ElementFilter("evt"); for(Element c : root.getDescendants(filter)) { evtnames.add( c.getAttributeValue("name") ); for (Iterator it=evtnames.iterator();it.hasNext();){ System.out.println(it.next()); } } } catch (IOException e) { e.printStackTrace(); } } }
Utilise le bouton # pour les balises CODE, ou alors ferme-les correctement [CODE] au début, pour ouvrir et [/CODE], à la fin, pour fermer, avec le slash (/).
Je t'ai dit que ce code ne peut pas fonctionner : tu mélanges du jdom2 et du "org.w3c.dom". Pourquoi tu ne continues pas avec le programme précédent qui fonctionne très bien avec jdom2 ?
Et si tu tiens à utiliser org.w3c.dom, et bien tu regardes la javadoc de la classe org.w3c.dom.Element, la méthode getElementsByTagName et la méthode getAttribute...