IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Parser un document XML avec DOM [DOM4J]


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 110
    Points : 39
    Points
    39
    Par défaut Parser un document XML avec DOM
    Bonjour,

    J'utilise la librairie DOM4J pour les traitements de fichiers XML en Java. Je cherche à parser un document XML existant avec DOM. Voici mon code :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    org.dom4j.io.DOMReader reader = new org.dom4j.io.DOMReader();
    DOMDocument staticDom = new DOMDocument(filename);
    Document staticDoc = reader.read(staticDom);
    Element staticRoot = staticDoc.getRootElement();



    Au debuggeur, la valeur de "filename" est OK (c'est le chemin système absolu). Lorsque l'instruction reader.read(staticDom); est executée, le rootElement est toujours null pourquoi ?

    Aidez moi, je vois pas pourquoi mon Document est mal initialisé après passage dans l'instruction read() (qui contruit l'arbre XML je suppose et initialise la structure Document).

    Merci

  2. #2
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut
    Bonjour,

    J'ai aussi utilisé la librairie DOM4J pour des traitements de fichiers XML, mais je n'avais pas utilisé les mêmes fonctions.
    Voici le code que j'ai utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    import org.dom4j.DocumentException; 
    import org.dom4j.DocumentHelper; 
    import org.dom4j.Element; 
     
    private org.dom4j.Document document;
    private Element racine;
     
    public void Essai(){
    // chargement des éventuelles infos des fichiers xml
    	File fiche= new File("toto.xml");
    		if(fiche.exists()) {			
    			try {
    				// on charge le document
    				document = DocumentHelper.parseText(contenu);
    				racine = document.getRootElement();	
    				document.removeProcessingInstruction("xml-stylesheet");
    			} catch (DocumentException e){
    				e.printStackTrace();
    			}	
    		} else {
    			System.out.println("fichier XML introuvable");
    		}
    }
    Désolée pour le peu de commentaires, tu devrais trouver l'aide que tu souhaites dans les liens doc Java et DOM4J

    Ensuite, en ayant la racine, tu peux te "balader" comme tu veux dans ton fichier XML et récupérer les infos que tu souhaites. (des méthodes en vrac : addElement, addAttribute, addText, selectNodes, remove, ...)

    J'espère que ça pourra t'aider.

    PS : Je ne garanti pas un éventuel problème avec les accents si tu en as dans ton fichier XML.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 110
    Points : 39
    Points
    39
    Par défaut
    Merci mais je plante sur l'instruction "selectSingleNode" et je ne sais pas pourquoi !!!!! J'ai essaié le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    File staticXML = new File(filename);
    SAXReader saxReader = new SAXReader();
    Document document = saxReader.read(staticXML);
    Node n = document.selectSingleNode("/mail/subject");
    Il s'agit d'un COPIER/COLLER du code d'IBM : http://www.ibm.com/developerworks/library/x-dom4j.html
    Le thread de debug plante à la dernière instruction comme si mon expression XPATH était fausse...j'en doute ... :heink:

    mon fichier xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8" ?>
    <mail>
    	<subject></subject>
    	<body>
    ...
    Aidez-moi

  4. #4
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 110
    Points : 39
    Points
    39
    Par défaut
    Je suis tombé sur un code zarbi : il cast tout les retours de 'selectSingleNode" en type Element alors que ce sont des type Node qui sont retournés. J'ai essaié et ça crash et d'après la javadoc, ce cast ne peut pas marcher...incompréhensible ce code.

    http://lists.labs.libre-entreprise.o...st/000013.html

  5. #5
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut
    Re,

    Pour ma part, j'utilise quelque chose de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Node n = racine.selectSingleNode("child::*[local-name(.)='mail']/child::*[local-name(.)='subject']");
    Tu peux toujours essayer si ça marche...

  6. #6
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 110
    Points : 39
    Points
    39
    Par défaut
    Ca marche pas mieux .
    Le code suivant marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (Iterator i = root.elementIterator("subject"); i.hasNext();) {
    			Element subject = (Element) i.next();
     
    			subject.setText(Context.getProperty("Mail.subject"));
    		}
    Mais c'est porki car "subject" peut apparaître plusieurs fois...le seul moyen d'être de matcher le bon noeud se fait avec XPATH. Mais impossible d'utiliser les fonctions selectNodes/selectSingleNode les seules permettant de requeter un noeud avec XPATH ... Aidez moi

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 110
    Points : 39
    Points
    39
    Par défaut
    C'est bon j'ai compris pourquoi ca marchait pas : j'ai oublié d'inclure les autres .jar en plus de dom4j.jar . J'avais un classnotfoundexception, mais la stacktrace était tellement grosse que le buffer de ma console d'eclipse était trop petit et donc je ne voyais pas l'erreur ; je l'ai chez moi sans ce websphere à la noix .
    Donc maintenant ça marche. Sinon merci beaucoup pour l'expression xpath !! elle est comme tu l'as donnée (complexe) pour que ca marche !!
    Sinon en mettant simplement "/mail/subject" ca plante. Par contre, pour la suite des query xpath, on peut utiliser la formule simple...mais pas au 1er appel :/

    bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public Document buildXMLStream() throws DocumentException, IOException {
    		File staticXML = new File(filename);
     
    		SAXReader saxReader = new SAXReader();
    		Document document = saxReader.read(staticXML);
    		Node node = document
    				.selectSingleNode("child::*[local-name(.)='mail']/child::*[local-name(.)='subject']");
    		node.setText(content.getSummary());
    		node = document
    				.selectSingleNode("/mail/body/description/correspondent/sheetNo");
    		node.setText(content.getSheetNo());
    		node = document
    				.selectSingleNode("/mail/body/description/correspondent/creationDate");
    		node.setText(content.getCreationDate());
    ...
    Merci beaucoup en tout cas pour l'expression xpath farfelue !!

    NB : j'ai d'autre problème maintenant, cf . autre post.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment parser un document xml avec gwt?
    Par zemzoum89 dans le forum GWT et Vaadin
    Réponses: 3
    Dernier message: 01/12/2010, 15h05
  2. [DOM] créer un document xml avec DOM
    Par bossy451 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 14/11/2008, 12h03
  3. Parser un fichier XML avec DOM
    Par Bayard dans le forum Général Python
    Réponses: 1
    Dernier message: 02/11/2007, 20h44
  4. parser un fichier xml avec dom
    Par cilies38 dans le forum Modules
    Réponses: 2
    Dernier message: 04/03/2007, 21h12
  5. [DOM XML][XSLT] Création d'un document XML avec PHP
    Par ToxiZz dans le forum Bibliothèques et frameworks
    Réponses: 21
    Dernier message: 16/01/2006, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo