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 :

Problème d'utilisation XPath [XPATH]


Sujet :

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

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable pôle Web
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable pôle Web
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Problème d'utilisation XPath
    Bonjour,

    Je suis assez nouveau avec Xpath et je galère un peu.
    Je bosse sur un Webservice Restfull avec Jersey + JaxB. Depuis peu on me demande s'il est possible de filtrer le résultat Xml du Webservice avec Xpath et du querystring.

    Ma 1ère question plus Java que Xpath, je n'ai pas trouvé de moyen simple pour passer de mon résultat JaxB à un Document XML sur lequel je peux requêter avec Xpath. Je fais donc 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
    15
    16
    17
    18
    19
    20
     
    		String retour = null;
    		final StringWriter strW = new StringWriter();
    		Application appl = getApplication(); //je vous épargne les couches métiers & compagnie.
     
    		final JAXBContext context = JAXBContext.newInstance(Application.class);
    		final Marshaller marsh = context.createMarshaller();
    		marsh.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    		marsh.marshal(appl, strW);
    		retour = strW.toString();
     
    		//partie Xpath
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		factory.setNamespaceAware(true);
    		DocumentBuilder builder;
    		Document doc = null;
    		XPathExpression expr = null;
    		builder = factory.newDocumentBuilder();
    		InputSource is = new InputSource(new StringReader(retour));
    		doc = builder.parse(is);
    ça marche, même si j'ai perdu un temps fou avec doc.toString() qui revoit un truc du type "#document : null" alors qu'il contient bien la recomposition de mes éléments XML.
    Existe-t-il un meilleurs moyen pour "connecter" Xpath et JaxB que ce que j'ai coder ?

    Mon deuxième problème est qu'une fois ma requête Xpath est effectuée je ne sais pas comment récupérer le résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    		// Create a XPathFactory
    		XPathFactory xFactory = XPathFactory.newInstance();
     
    		// Create a XPath object
    		XPath xpath = xFactory.newXPath();
     
    		expr = xpath.compile(fields);
    		Object result = expr.evaluate(doc, XPathConstants.NODE);
    Comment re-transformer ceci en String XML contenant mes objets ? Dois-je la recréer à la main avec l'api bas niveau DOM ?

    Merci d'avoir lu et merci de votre aide.

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Existe-t-il un meilleurs moyen pour "connecter" Xpath et JaxB que ce que j'ai coder ?
    [1] D'abord, la partie ne s'agissant pas encore le xpath: la partie où qu'il s'agisse d'établir le Document doc. JAXB prend ça comme un noyau de fonctionalité qu'il s'occupe à apporter le soutien. Voici comment le faire.
    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
     
            String retour = null;
            //final StringWriter strW = new StringWriter();
            Application appl = getApplication(); //je vous épargne les couches métiers & compagnie.
     
            final JAXBContext context = JAXBContext.newInstance(Application.class);
            final Marshaller marsh = context.createMarshaller();
            marsh.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            //marsh.marshal(appl, strW);    //re-placer plus bas
            //retour = strW.toString();
     
            //partie Xpath
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            DocumentBuilder builder;
            Document doc = null;
     
            XPathExpression expr = null;  //vaut mieux de le re-placer plus bas?!
     
            builder = factory.newDocumentBuilder();
            //InputSource is = new InputSource(new StringReader(retour));
            //doc = builder.parse(is);
            doc=builder.newDocument(); 
     
            marsh.marshal(appl, doc);
    [2] Et puis la sérialization de result. On peut la faire au dedans dom niveau 3 (Load & Save), mais ça a une apparence moins intuitive. On peut utilser xslt pour la faire qui est non moins un soutien complet.
    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
     
        //...
        Node result = (Node)expr.evaluate(doc, XPathConstants.NODE);
     
        String scharset="UTF-8";
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.ENCODING,scharset);
     
        ByteArrayOutputStream bas=new ByteArrayOutputStream();
        Writer osw=new OutputStreamWriter(bas,scharset);
        Writer pw=new PrintWriter(new BufferedWriter(osw));
     
        StreamResult streamresult = new StreamResult(pw);        
        DOMSource domsource = new DOMSource(result);
        transformer.transform(domsource, streamresult);
     
        String s=bas.toString(scharset);    //ce qu'on désire d'avoir
    Qu'on puisse simplifier un peu le traitement d'enchaînement des "streams" sans perte le contrôle total d'encodage des caractères? c'est possible. Je n'y ai pensé pas trop.

  3. #3
    Candidat au Club
    Homme Profil pro
    Responsable pôle Web
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable pôle Web
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup pour ton aide tsuji, j'obtiens ce que je souhaite.
    Bonne continuation !

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

Discussions similaires

  1. [XPATH] DELPHI / MSXML problème d'utilisation
    Par görgh dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/01/2009, 12h16
  2. Problème d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    Réponses: 10
    Dernier message: 06/08/2004, 14h35
  3. [cvs] problèmes d'utilisation
    Par gromite dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/06/2004, 17h41
  4. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18
  5. problème d'utilisation avec turbo pascal 7.0
    Par le 27 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 03/12/2003, 10h44

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