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

XSL/XSLT/XPATH XML Discussion :

[Xpath] [Java] Comment ignorer les namespaces avec XPath?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre expérimenté
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Points : 1 464
    Points
    1 464
    Par défaut [Xpath] [Java] Comment ignorer les namespaces avec XPath?
    Bonjour,
    j'ai un probleme avec XPath lorsque mon DOM chargé a l'aide de Java Xerces a un namespace.

    Dans le cas ou je charge un DOM avec le contenu suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html>
      <input type="text" />
    </html>
    et que j'applique un XPath avec //input, la j'arrive a recuprer le node input.

    Par contre si j'ai un namespace comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html xmlns="http://www.w3.org/1999/xhtml" >
      <input type="text" />
    </html>
    J'ai vu qu'il y avait l'objet NamespaceContext sur l'instance XPath, mais cet objet marche si on met on a un namespace comme ceci xmlns:html="http://www.w3.org/1999/xhtml" et si la requete xpath est du type //html:input.

    J'aimerais bien eviter de faire ca et je me demandais si il etait possible de faire fonctionner Xpath avec un namspace. Merci de votre aide.

    Angelo

    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
    // 1. Chargement du contenu du fichier HTML dans un DOM
    /* <html xmlns="http://www.w3.org/1999/xhtml" >
    <input type="text" />
    </html>
    */		
    InputStream source = XPathTest.class.getResourceAsStream("form.html");
    org.apache.xerces.parsers.DOMParser parser = new org.apache.xerces.parsers.DOMParser();			
    parser.setFeature("http://xml.org/sax/features/namespaces", true);
    parser.parse(new InputSource(source));
    source.close();			
    Document document = parser.getDocument();
     
    // 2. Recuperation d'une factory XPath
    XPathFactory xpathFactory = new org.apache.xpath.jaxp.XPathFactoryImpl();
    XPath xpath = xpathFactory.newXPath();
     
    // 3. Compilation de l'expression XPath //input
    XPathExpression pathExpression = xpath.compile("//input");
     
    // Recuperation d'element input 
    Node node = (Node)pathExpression.evaluate(document, XPathConstants.NODE);
    // => Ici le node est null si il y a xmlns="http://www.w3.org/1999/xhtml
    // Le cas marche si je ne mets pas de namespace. 
    /* <html>
    	<input type="text" />
    </html>
    */	
    System.out.println(node);

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    Citation Envoyé par azerr Voir le message
    J'ai vu qu'il y avait l'objet NamespaceContext sur l'instance XPath, mais cet objet marche si on met on a un namespace comme ceci xmlns:html="http://www.w3.org/1999/xhtml" et si la requete xpath est du type //html:input.
    Non non, ça marchera également avec un espace de nom par défaut dans la source XML. C'est juste toi qui définira arbitrairement un préfixe pour l'espace de nom.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre expérimenté
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Points : 1 464
    Points
    1 464
    Par défaut
    Bonjour GrandFather,

    Merci de ta reponse. Mais je n'arrive pas a faire marcher le cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html xmlns="http://www.w3.org/1999/xhtml" >
      <input type="text" />
    </html>
    avec Xpath //input

    Quand j'ai le contenu sans namespace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html>
      <input type="text" />
    </html>
    XPath fonctionne.

    Comment dois je modifier mon code pour que mon cas fonctionne.
    Ce que j'ai reussi a faire, c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html xmlns:html="http://www.w3.org/1999/xhtml" >
      <input type="text" />
    </html>
    en utilisant NamespaceContext comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    XPath xpath = xpathFactory.newXPath();
    			xpath.setNamespaceContext(new NamespaceContext() {
    				public String getNamespaceURI(String s) {
    					if ("html".equals(s))
    						return "http://www.w3.org/1999/xhtml";
    					return null;
    				}
    				public String getPrefix(String s) {
    					return null;
    				}
    				public Iterator getPrefixes(String s) {
    					return null;
    				}
    			});
    et apres je dois utiliser le Xpath //html:input

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XPathExpression pathExpression = xpath.compile("//html:input");
    Moi ce que je souhaiterais ecrire, c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XPathExpression pathExpression = xpath.compile("//input");
    Je n'ai rien vu sur le net traitant de ce sujet. Je croies que je vais recuperer les sources de Xalan et comprendre comment on peut faire.

    Merci de ton aide.

    Angelo

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par azerr Voir le message
    Mais je n'arrive pas a faire marcher le cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html xmlns="http://www.w3.org/1999/xhtml" >
      <input type="text" />
    </html>
    avec Xpath //input
    C'est normal, XPath n'est pas sensé savoir que l'input de ton expression XPath appartient au même espace de noms que celui de la source XML. Il faut que tu utilises le préfixe pour que la correspondance se fasse.

    Par ailleurs, pour que l'espace de noms par défaut soit pris en compte, il faut que tu implémentes getPrefix() de telle façon à renvoyer "html" quand on lui présente "http://www.w3.org/1999/xhtml" en argument.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  5. #5
    Membre expérimenté
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Points : 1 464
    Points
    1 464
    Par défaut
    Encore merci a toi GrandFather de ton aide.

    Voici ce que je comprends de ton explication. La requete Xpath doit avoir un namespace defini (n'importe quoi, ex : mynamespace) et ensuite avec le NamespaceContext on indique que mynamespace correspond a http://www.w3.org/1999/xhtml.

    Ce qui donne :

    Contenu DOM :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html xmlns="http://www.w3.org/1999/xhtml" >
    	<input type="text" />
    </html>
    NamespaceContext :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    xpath.setNamespaceContext(new NamespaceContext() {
    				public String getNamespaceURI(String s) {
    					if ("mynamespace".equals(s))
    						return "http://www.w3.org/1999/xhtml";
    					return null;
    				}
    				public String getPrefix(String s) {
    					return null;
    				}
    				public Iterator getPrefixes(String s) {
    					return null;
    				}
    			});
    XPath :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XPathExpression pathExpression = xpath.compile("//mynamespace:input");
    Ca ca marche bien.

    Mais en fait ce que je souhaiterais c'est faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XPathExpression pathExpression = xpath.compile("//input");
    Mais d'apres ce que je comprends, ca n'est pas possible.
    C'est bien ca?
    Par ailleurs, pour que l'espace de noms par défaut soit pris en compte, il faut que tu implémentes getPrefix() de telle façon à renvoyer "html" quand on lui présente "http://www.w3.org/1999/xhtml" en argument.
    Je n'arrive jamais a passer dans la methode getPrefix. Ma request XPath n'est pas valide?

    Encore merci de ton aide.

    Angelo

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,
    Citation Envoyé par azerr Voir le message
    Mais d'apres ce que je comprends, ca n'est pas possible.
    C'est bien ca?
    Non, effectivement, ça ne l'est pas. Tu es obligé de qualifier l'élément input dans ta requête pour le moteur XPath considère qu'il s'agit du même input que celui de la source XML et qui appartient à l'espace de noms XHTML. Il n'est pas possible de définir un espace de noms par défaut pour les éléments de la requête XPath qui correspondrait à celui de la source, d'autant que cet espace de noms peut varier dans la source.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  7. #7
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    sinon pour obtenir la balise input ayant le namespace toto tu peux utiliser les xpath suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //tutu:input
    //*:input
    //*[name()='input']

  8. #8
    Membre expérimenté
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Points : 1 464
    Points
    1 464
    Par défaut
    Bonjour,

    Merci beaucoup de votre aide.

    Je suis actuellement en train d'implementer la grammaire XForms pour mon projet Tk-UI.

    Pour l'instant la grammair XUL est bien avancee.

    Ce que j'ai du mal a comprendre c'est que dans cet exemple de XForms, le control <select1 ref="@as"> est binde avec l'attribut as de l'element <my:payment as="credit">.

    Et dans ce cas ci il il n'y a aucun namespace defini dans le XPath ref.
    Si je suis vos explication on devrait avoir une Xpath du genre

    <select1 ref="//*:my@as"> (je ne sais pas si c'est une requte XPath valide).

    En tout cas merci de votre aide.

    Angelo

  9. #9
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    un truc comme cela serait valide

  10. #10
    Membre expérimenté
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Points : 1 464
    Points
    1 464
    Par défaut
    merci

    Mais ca veut dire que l'exemple de XForms n'est pas valide?

    Angelo

  11. #11
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Dans <my:payment as="credit"> l'attribut as n'a pas de namespace : il convient donc de l'appeler par @as et non pas par @my:as
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  12. #12
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Pour compléter la réponse d'Alain, il faut bien tenir compte d'une spécificité des attributs vis à vis des espaces de noms lorsque l'on écrit sa requête XPath : les espaces de noms par défaut ne s'appliquent qu'aux éléments sans préfixe, pas aux attributs. En conséquence, pour appartenir à un espace de nom, un attribut sera toujours précédé d'un préfixe alias de cet espace de noms.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  13. #13
    Membre expérimenté
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Points : 1 464
    Points
    1 464
    Par défaut
    Bonjour a vous deux,

    J'ai tout compris de vos explications. Je vous remercie énormement.
    Le binding XForms que je suis en train d'implementer commence a bien marcher.

    Merci beaucoup de votre aide. Je vais mettre en place de ce pas le binding avec les attributs et tester le cas des attributs.

    Bonne journee

    Angelo

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/05/2011, 11h36
  2. Réponses: 1
    Dernier message: 10/08/2005, 17h11
  3. [pgAdminIII] Comment ignorer les erreurs de script
    Par Escandil dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 22/07/2005, 12h03
  4. [CF][PPC/VB.NET] Comment utiliser les Socket avec Pocket PC ?
    Par joefou dans le forum Windows Mobile
    Réponses: 5
    Dernier message: 17/05/2005, 14h24
  5. Comment saisir les racines avec OpenOffice ?
    Par poxtra_102 dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 08/10/2004, 19h05

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