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 :

[XML] Récupérer la valeur d'un champ par son nom


Sujet :

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

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 154
    Points : 110
    Points
    110
    Par défaut [XML] Récupérer la valeur d'un champ par son nom
    Bonjour,

    Je débute sous Java et l'on me demande, dans un premier temps, de récupérer un numéro de question ainsi qu'un numéro de client depuis un fichier XML.

    J'ai donc suivi le tuto de ce site (super bien fait d'ailleurs) pour gérer les fichiers XML. Je me suis orienté vers le DOM via javax.

    Voici mon code en java :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    import javax.xml.parsers.*;
    import org.w3c.dom.*;
    import org.xml.sax.*;
    import java.io.*;
     
    public class TestXML {
     
    //	String toto;
    //	final String test = "45";
    	static String uri;
    	static String xVersion;
    	static String xEncoding;
    	static String iEncoding;
    	static boolean standalone;
    	static boolean strictError;
     
    	static int cpt = 0;
     
    	static String NumQuestion;
    	static String Noclie;
    	static String DateQuestion;
     
    	/*Les propriétés du document*/
    	public static void printDOMInfos(Document document){
     
    		uri = document.getDocumentURI();
    		//Version?
    		xVersion = document.getXmlVersion();
    		//UTF-8?
    		xEncoding = document.getXmlEncoding();
     
    		iEncoding = document.getInputEncoding();
     
    		standalone = document.getXmlStandalone();
     
    		strictError = document.getStrictErrorChecking();
     
    	}
     
     
     
    	public static void printNode(Node node){
    		cpt++;
    		System.out.println(node + " " + cpt);
    		NodeList nodes = node.getChildNodes();
    		for(int i=0; i<nodes.getLength(); i++){
    			Node n = nodes.item(i);
    			printNode(n);
     
    		}
    	}
    	public static void printDocument(Document document){
    		Element racine = document.getDocumentElement();
    		printNode(racine);
    	}
     
    	public static String ExtractQuestion(Document document){
    		Element racine = document.getDocumentElement();
    		return racine.getChildNodes().item(1).getTextContent();
    	}
     
    	public static String ExtractNoclie(Document document){
    		Element racine = document.getDocumentElement();
    		return racine.getChildNodes().item(3).getTextContent();
    	}
     
    	public static String ExtractDate(Document document){
    		Element racine = document.getDocumentElement();
    		return racine.getChildNodes().item(5).getTextContent();
    	}
     
    	/**
             * @param args
             */
    	public static void main(String[] XmlFile) {
    		try {
    			// cr‚ation d'une fabrique de documents
    			DocumentBuilderFactory fabrique = DocumentBuilderFactory
    					.newInstance();
    			// cr‚ation d'un constructeur de documents
    			DocumentBuilder constructeur = fabrique.newDocumentBuilder();
    			// lecture du contenu d'un fichier XML avec DOM
    			File xml = new File(XmlFile[0]);
    			// System.out.println(xml.exists());
    			Document document = constructeur.parse(xml);
     
    			//On récupère les propriétés du document
    			printDOMInfos(document);
     
    			//printDocument(document);
     
    			//GetQuestionNum(document);
     
    			NumQuestion = ExtractQuestion(document);
    			Noclie = ExtractNoclie(document);
    			DateQuestion = ExtractDate(document);
     
    			System.out.println(NumQuestion);
    			System.out.println(Noclie);
    			System.out.println(DateQuestion);
     
    		} catch (ParserConfigurationException pce) {
    			System.out.println("Erreur de configuration du parseur DOM");
    			System.out.println("lors de l'appel … fabrique.newDocumentBuilder();");
    		} catch (SAXException se) {
    			se.printStackTrace();
    			System.out.println("Erreur lors du parsing du document");
    			System.out.println("lors de l'appel … construteur.parse(xml)");
    		} catch (IOException ioe) {
    			System.out.println("Erreur d'entr‚e/sortie");
    			System.out.println("lors de l'appel … construteur.parse(xml)");
    		}
    	}
    }
    Et voici le fichier XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?xml version="1.0" encoding="UTF-8"?>
    <MESSAGE xmlns="http://www.xxxx.fr/file.xsd"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.xxxx.fr/file.xsd file:/N:/AAA/BBB/CCCC/DDDD/http://www.xxxx.fr/file.xsd">
        <ID>7d85b761-8d36-4f50-a5c5-9e5c72a11ee2</ID>
        <N_CLIENT>12345</N_CLIENT>
        <DATE>2006-05-04T18:13:51.0Z</DATE>
    </MESSAGE>
    Comment faire lire, par exemple, l'ID sans passer par un :
    racine.getChildNodes().item(3).getTextContent();

    En utilisant un document.getElementsByTagName("ID");, cela me retourne rien...

    Merci


    Portekoi

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    En utilisant un document.getElementsByTagName("ID");, cela me retourne rien...
    getElementsByTagName retourne un tableau, donc il faut le parcourir.

    A+.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 557
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Citation Envoyé par Portekoi Voir le message
    Comment faire lire, par exemple, l'ID sans passer par un :
    racine.getChildNodes().item(3).getTextContent();

    En utilisant un document.getElementsByTagName("ID");, cela me retourne rien...
    Dans le document que tu nous montres, l'élément <ID> est dans un namespace : le namespace http://www.xxxx.fr/file.xsd .

    Il faut donc utiliser getElementsByTagNameNS() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementsByTagNameNS("http://www.xxxx.fr/file.xsd", "ID");
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 154
    Points : 110
    Points
    110
    Par défaut
    Re,

    Merci pour vos réponses.

    J'ai essayé de faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    document.getElementsByTagNameNS("http://www.xxxx.fr/file.xsd", "ID").toString();
    Mais il me retourne :
    org.apache.xerces.dom.DeepNodeListImpl@45484548
    Je ne vois pas d'où cela vient. Ai je mal compilé?

    Merci encore.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 557
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Ben... C'est normal. C'est une implémentation de NodeList. C'est bien ce que doit renvoyer cette méthode.

    NodeList est un genre de mauvaise représentation objet d'un tableau d'éléments.
    Il faut faire getLength() pour savoir combien il y en a, et getItem(0), getItem(1), etc. Pour récupérer les nœuds.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 154
    Points : 110
    Points
    110
    Par défaut
    Je me disais aussi que le toString() me paraissait trop simple

    J'ai fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NodeList nodes = document.getElementsByTagNameNS("http://www.xxxx.fr/file.xsd", "ID");
    		Node node = nodes.item(0);
     
    		if(node != null){
    			return node.toString();
    		}else{
    			return " ";
    		}
    Mais j'ai toujours du null...

    Merci encore

  7. #7
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 154
    Points : 110
    Points
    110
    Par défaut
    Je complète :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(nodes.getLength());
    Me renvoi 0

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 557
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Ah...

    Et c'était aussi le cas de getElementsByTagName() ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 154
    Points : 110
    Points
    110
    Par défaut
    Cela me retourne 1 mais la valeur est :
    [ID_MENSAGEM: null]

    Et si j'affiche mon ficher en détail via la fonction printDocument présente de le tuto de ce site, j'obtiens ceci :


    [MESSAGE: null]
    [#text:
    ]
    [ID: null]
    [#text: 7d85b761-8d36-4f50-a5c5-9e5c72a11ee2]
    [#text:
    ]
    [N_CLIENT: null]
    [#text: 12345]
    [#text:
    ]
    [DATE: null]
    [#text: 2006-05-04T18:13:51.0Z]
    [#text:
    ]
    Je comprends pas les "#text"...

  10. #10
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 154
    Points : 110
    Points
    110
    Par défaut
    Ceci fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    NodeList nodes = document.getElementsByTagName("ID");
    Node node = nodes.item(0);
     
    System.out.println(node.getNodeName());
    System.out.println(node.getTextContent());
    Retourne :
    ID
    7d85b761-8d36-4f50-a5c5-9e5c72a11ee2

    Mais avec le NS, ca marche pas... une idée?

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 557
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Citation Envoyé par Portekoi Voir le message
    Mais avec le NS, ca marche pas... une idée?
    Les gestionnaires de XML Java peuvent gérer les namespaces ou ne pas les gérer, cela dépend de beaucoup de choses. S'ils ne sont pas gérés, tout fonctionne comme si les namespaces n'existent pas. S'ils sont gérés, il faut tenir compte de leur existence.

    Comme, au début, tu disais que tu n'obtenais rien avec getElementsByTagName(), j'ai supposé que les namespaces étaient activés et je t'ai donné la solution dans ce cas-là.

    Apparemment, les namespaces ne sont pas activés, et tu as mal décrit ton problème au début : quand une méthode te retourne quelque chose, il ne faut pas dire qu'elle ne retourne rien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Est-ce que "ID" apparient au namespace de file.xsd ?
    Si ce n'est pas le cas, essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NodeList nodes = document.getElementsByTagNameNS("*", "ID");
    A+.

Discussions similaires

  1. Récupérer la valeur d'un champ texte par programmation
    Par walidinfo dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 26/11/2010, 17h20
  2. [AC-2003] Récupérer la Lettre d'un lecteur par son nom de volume
    Par vversaveau dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/07/2010, 12h33
  3. Récupérer la valeur d'un champ XML dans une variable
    Par adrien357 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 24/02/2010, 11h05
  4. Réponses: 2
    Dernier message: 14/07/2009, 08h45
  5. Réponses: 2
    Dernier message: 24/11/2008, 10h53

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