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 quand plusieurs lectures avec XPathExpression [XPATH]


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut Problème quand plusieurs lectures avec XPathExpression
    Bonjour,

    J'ai des soucis de performance d'un programme Java.
    Je cherche donc à l'optimiser en utilisant les XPathExpression.

    J'ai bien réussi à faire un petit test.

    Mais j'ai un gros souci lorsque je les inclus dans mon programme.
    Ca ne marche plus !

    En fait, c'est dans le main que l'erreur se produit, ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    leftField = leftFieldExpr.evaluate(isDesripteurXml);
    separator = separatorExpr.evaluate(isDesripteurXml);
    rightField = rightFieldExpr.evaluate(isDesripteurXml);
    Chacune de ces expression prise individuellement fonctionne
    Mais impossible d'en faire plus de 2 !!!

    Voici le fichier XML.

    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <data type="02">
        <dataDescription>
            <dataOrganisation>
                <field role="NAME"/>
                <field role="SEPARATOR" value=";"/>
                <field role="VALUE"/>
            </dataOrganisation>
     
            <dataFields>
                <field name="ADHEOFD"/>
                <field name="ADHEOFR"/>
                <field name="BUYRBIC"/>
                <field name="BUYRLB1"/>
                <field name="CENTRDT"/>
                <field name="TYPCOMM"/>
                <field name="TYPSORA"/>
                <field name="VALORDT"/>
                <field name="ZONEGEO"/>
            </dataFields>
            <recordType>
                <firstField name="DEBFLUX"/>
                <lastField name="FINFLUX"/>
            </recordType>
        </dataDescription>
    </data>
    et voici la source Java des mon test unitaire.

    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
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
     
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathExpression;
    import javax.xml.xpath.XPathExpressionException;
    import javax.xml.xpath.XPathFactory;
     
    import org.xml.sax.InputSource;
     
    public class TestXPath {
     
        private static InputSource isDesripteurXml = null;
        private static XPathExpression leftFieldExpr = null;
        private static XPathExpression separatorExpr = null;
        private static XPathExpression rightFieldExpr = null;
     
        private static void init(File desripteurXml) throws FileNotFoundException, XPathExpressionException {
     
            FileInputStream fis = new FileInputStream(desripteurXml);
            isDesripteurXml = new InputSource(fis);
            compileAllXPathExpressions();
        }
     
        private static void compileAllXPathExpressions() throws XPathExpressionException {
     
            String leftFieldXPath = "//dataDescription/dataOrganisation/field[1]/@role";
            String separatorXPath = "//dataDescription/dataOrganisation/field[2]/@value";
            String rightFieldXPath = "//dataDescription/dataOrganisation/field[3]/@role";
     
            XPathFactory factory = XPathFactory.newInstance();
            XPath xPath = factory.newXPath();
     
            leftFieldExpr = xPath.compile(leftFieldXPath);
            separatorExpr = xPath.compile(separatorXPath);
            rightFieldExpr = xPath.compile(rightFieldXPath);
        }
     
        public static void main(String[] args) {
     
            File desripteurXml = new File(args[0]);
            System.out.println("Fichier '" + args[0] + "' ouvert.");
     
            try {
                init(desripteurXml);
                System.out.println("Initialisation OK.");
            } catch (FileNotFoundException e) {
                System.out.println("Erreur suite à l'ouverture du fichier '" + desripteurXml + "'.");
                System.exit(2);
            } catch (XPathExpressionException e) {
                System.out.println("Erreur de compilation: " + e.getCause());
                System.exit(2);
            }
     
            String leftField = null;
            String separator = null;
            String rightField = null;
     
            try {
                leftField = leftFieldExpr.evaluate(isDesripteurXml);
                separator = separatorExpr.evaluate(isDesripteurXml);
                rightField = rightFieldExpr.evaluate(isDesripteurXml);
            } catch (XPathExpressionException e) {
                System.out.println("xPath.evaluate: " + e.getCause());
                System.exit(2);
            }
     
            System.out.println("leftField=" + leftField);
            System.out.println("separator=" + separator);
            System.out.println("rightField=" + rightField);
        }
    }
    Est-ce que quelqu'un peut m'aider?

    Merci.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par domiq44 Voir le message
    J'ai des soucis de performance d'un programme Java.
    Je cherche donc à l'optimiser en utilisant les XPathExpression.
    Je ne comprends pas la logique. Je ne vois pas ce qui pourrait faire penser que les XPathExpression amélioreraient les performances.

    Cela peut arriver dans certains cas d'utilisation qui ne semblent pas correspondre au tien, mais ce n'est pas du tout prévu pour, et en principe c'est plutôt censé être le contraire.
    XPath sert à optimiser la lisibilité du code. Pas les performances. En particulier, pas si on n'a pas chargé le fichier dans un DOM, parce que, dans ce cas, le moteur XPath a de bonnes chances d'être obligé de le faire lui-même... À chaque appel.

    Citation Envoyé par domiq44 Voir le message
    Chacune de ces expression prise individuellement fonctionne
    Mais impossible d'en faire plus de 2 !!!
    Pour moi, c'est déjà une surprise que cela marche une fois. J'ignorais complètement qu'on pouvait donner une InputSource à evaluate(). Bien, j'apprends un truc.

    Comme l'indique la JavaDoc de InputSource (et comme la manière de le construire devrait le rendre évident,) une InputSource basée sur autre chose qu'une URI ne peut servir qu'une fois. 3 appels => 3 InputSource, qui peuvent tout-à-fait tirer leur InputStream du même File à chaque fois.

    Raison pour laquelle ce n'est probablement pas très optimisé pour toi : tu te retaperais 3 fois le même boulot sur le même fichier.
    Il vaut mieux charger une fois le fichier dans un DOM, puis appeler tes expressions sur ce DOM. Mais tout ce traitement, s'il simplifie les choses, a peu chances d'être plus performant qu'une lecture SAX ad hoc.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Merci thelvin pour ta réponse.

    Le but est d'extraire la structure présente dans le XML sous forme de classes et sous classes valorisées.

    Ok, je me suis trompé, je pensais réeellement que XPath pouvait conduire à une amélioration des performances. Bon, ce n'est pas le cas.

    Actuellement, les accés au données se font par les méthodes suivantes :

    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
     
    SAXBuilder sxb = new SAXBuilder();
    Document document = sxb.build(xmlFile);
    racine = document.getRootElement();
    ...
    Element dataDescription = racine.getChild("dataDescription");
    Element dataOrganisation = dataDescription .getChild("dataOrganisation");
    ...
    List listField = dataOrganisation .getChildren("field");
    Iterator iter = listField.iterator();
    Element courant = (Element) iter.next();
    String firstRole = courant.getAttributeValue("role");
    courant = (Element) iter.next();
    String separator = courant.getAttributeValue("value");
    courant = (Element) iter.next();
    String secondRole = courant.getAttributeValue("role");
    ...
    Elles sont probablement suffisamment performantes.
    Je ne sais pas.

    Merci.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    À vue de nez, difficile de faire plus performant que ça.
    Une lecture SAX le serait sans doute, mais ça devient compliqué.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Citation Envoyé par thelvin Voir le message
    À vue de nez, difficile de faire plus performant que ça.
    Une lecture SAX le serait sans doute, mais ça devient compliqué.
    J'abuserais en demandant en quoi consiste une lecture SAX?

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Disons que Google t'en aurais sûrement assez dit, ainsi que :

    La FAQ : http://java.developpez.com/faq/xml/?page=sax
    Les tutos : http://smeric.developpez.com/java/cours/xml/sax/

    Après c'est pas d'une simplicité lumineuse, c'est sûr, c'est pour ça que d'habitude on utilise du DOM avec XPath, et tant pis pour les performances et la mémoire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/10/2013, 12h13
  2. Réponses: 1
    Dernier message: 31/07/2011, 09h02
  3. [DEBUTANT] Problème de lecture avec un fscanf
    Par Pingouin dans le forum C
    Réponses: 26
    Dernier message: 28/05/2006, 18h10
  4. Problème pour différencier plusieurs select avec le même nom
    Par vallica dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/04/2006, 11h35
  5. [DOM] Problème de lecture avec DOM
    Par samios dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 29/09/2004, 15h58

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