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 :

Récupérer les informations des nœuds parents [XPATH]


Sujet :

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

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 63
    Points : 45
    Points
    45
    Par défaut Récupérer les informations des nœuds parents
    Salut,

    Un flux représente un annuaire téléphonique. Les contacts sont répartis dans des services, eux-même répartis dans des sociétés.

    Code xml : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <annuaire xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="personne.xsd">
    	<societe nom="soc_a">
    		<service nom="serv_a">
    			<contact>
    				<nom>nomPers_a</nom>
    				<prenom>prenomPers_a</prenom>
    				<num_tel>123456</num_tel>
    			</contact>
    			<contact>
    				<nom>nomPers_b</nom>
    				<prenom>prenomPers_b</prenom>
    				<num_tel>321654</num_tel>
    			</contact>
    		</service>
     
    		<service nom="serv_b">
    			<contact>
    				<nom>nomPers_c</nom>
    				<prenom>prenomPers_c</prenom>
    				<num_tel>123456</num_tel>
    			</contact>
    			<contact>
    				<nom>nomPers_d</nom>
    				<prenom>prenomPers_d</prenom>
    				<num_tel>321654</num_tel>
    			</contact>
    		</service>
    	</societe>
    </annuaire>

    Je dois intégrer ces données dans une base. Je dois récupérer les contacts (nom, prénom, num_tel), mais aussi le service et la société d'appartenance.

    Par exemple, je dois récupérer toutes les contacts de la société A. Pour cela, j'utilise XPath :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    XPathFactory xPathFact = XPathFactory.newInstance();
    XPath xpath = xPathFact.newXPath();
     
    XPathExpression exp = xpath.compile("//annuaire/societe[@nom='soc_a']/service/contact");
    NodeList liste = (NodeList) exp.evaluate(documentXml, XPathConstants.NODESET);

    J'ai donc une liste de Node. Ma question est : Comment récupérer les informations des nœuds parents (en particulier les attributs comme "serv_a", "soc_a") ?

    En réalité, mon document XML contient beaucoup plus de niveaux (région mondiale, niveau hiérarchique, etc.) Par conséquent, j'aimerais éviter l'utilisation de getParentNode(), surtout si le schéma XML est amené à évoluer...

    N'y-a-t-il pas moyen d'utiliser XPath sur un Node ?

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Normalement XPath s'applique sur le contexte d'un nœud quelconque, en pratique soit un document, soit un élément.

    La méthode evaluate() demande un contexte de type Object, c'est-à-dire qu'elle s'occupe de regarder ce que c'est et d'agir en fonction. Il te suffit d'y passer un Element au lieu d'un Document

    En tout cas en JDOM ça marche.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Merci pour ta réponse thelvin

    OK, je comprends. Est-ce que ça veut dire que j'aurai autant d'expression XPath que d'élément par nœud à récupérer ?

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Euh... Quoi ?

    "D'élément par nœud" ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Je récupère une liste de nœuds, chacun représentant un contact. Je veux récupérer plusieurs informations contenues dans les nœuds parents (ce que j'ai appelé "élément". C'est vrai que le terme que j'ai choisi ici peut prêter à confusion).

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Alors comment répondre...

    Disons que si, pour chaque nœud parent, tu as besoin de récupérer deux informations, alors ça te fait deux expressions XPath au total, oui.

    (Plus ta première expression XPath, donc 3 au total, en fait).
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Exact !

    J'ai compris le principe. En pratique, c'est moins clair...

    Reprenons l'exemple de document XML donné dans mon premier post. Voici une portion de code qui devrait afficher les services d'appartenance de chacun des contacts.
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //J'ai donc ma première expression XPath qui me récupère une liste de noeuds représentant les contacts
    XPathExpression exp = xpath.compile("/annuaire/societe[@nom='soc_a']/service/contact");
    NodeList listeContacts = (NodeList) exp.evaluate(documentXml, XPathConstants.NODESET);
     
    //je parcours chacun des contact pour en extraire les informations qui m'intéressent
    for (int i = 0; i < listeContacts.getLength(); i++) {
        Node unContact = listeContacts.item(i);
     
        //je prépare mon expression XPath pour récupérer le nom de service auquel appartient le contact
        XPathExpression xPathExpr = xpath.compile("/annuaire/societe/service/attribute::nom");
        //j'affiche le nom de service d'appartenance du contact
        System.out.println((String) xPathExpr.evaluate(unContact, XPathConstants.STRING));
    }

    En réalité, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    serv_a
    serv_a
    serv_a
    serv_a
    alors que j'aimerais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    serv_a
    serv_a
    serv_b
    serv_b
    D'où vient le problème ?

    Merci pour ton aide thelvin

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Ce qui est étrange, c'est que je récupère bien des nœuds différents :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i = 0; i < listeContacts.getLength(); i++) {
        Node unContact = listeContacts.item(i);
     
        System.out.println(unContact.getParentNode().getAttributes().getNamedItem("nom"));
    }

    La sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nom="serv_a"
    nom="serv_a"
    nom="serv_b"
    nom="serv_b"
    Mais mettre des getParentNode() dans tous les sens...

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Alors, pour commencer, tu pourrais simplement boucler sur les services, et pour chaque service donner la liste des contacts.

    Ensuite, le xPath pour récupérer le service d'un contact, c'est "../service@nom".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Merci thelvin

    Ma requête XPath était tout simplement fausse. Effectivement si je fais "parent::service/attribute::nom", ça va beaucoup mieux !

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

Discussions similaires

  1. Drupal : récupérer les informations des produits
    Par infoPFE dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 08/05/2013, 12h37
  2. Réponses: 2
    Dernier message: 13/10/2011, 16h08
  3. Réponses: 1
    Dernier message: 20/06/2011, 17h22
  4. [phpBB][3] Récupérer les informations des sondages et faire une page de statistiques
    Par boubouchon dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 06/04/2009, 20h47
  5. Récupérer les noms des classes parents
    Par see++ dans le forum Général Python
    Réponses: 2
    Dernier message: 12/03/2007, 17h35

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