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 :

Manipulation d'un fichier XML avec SAX parse


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Par défaut Manipulation d'un fichier XML avec SAX parse
    Salut,

    Je suis entrain de parser un fichier XML très large avec le SAX parser de JAVA. Le fichier est structuré comme suit :

    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <LexicalResource>
      <Lexicon label="Arabic" language="arb" languageCoding="UTF-8" owner="http://www.globalwordnet.org/AWN/" version="1.0">
        <LexicalEntry id="$Ary_AlmtwsT_1">
          <Lemma partOfSpeech="n" writtenForm="aaaa bbbbb"/>
          <Sense id="$Ary_AlmtwsT_1_mnTqp_$Ary_AlmtwsT_n1AR" synset="mnTqp_$Ary_AlmtwsT_n1AR"/>
        </LexicalEntry>
        <LexicalEntry id=" kiyoluw mitor_1">
          <Lemma partOfSpeech="n" writtenForm=" ccccc ddddd"/>
          <Sense id=" kiyoluw mitor_1_kiyoluw_mitor_n1AR" synset="kiyoluw_mitor_n1AR"/>
        </LexicalEntry>
        <LexicalEntry id=" ZalomA'_1">
          <Lemma partOfSpeech="n" writtenForm=" fffffff"/>
          <Sense id=" ZalomA'_1_ZalAam_n1AR" synset="ZalAam_n1AR"/>
          <WordForm formType="root" writtenForm="aze"/>
        </LexicalEntry>
      </Lexicon>
    </LexicalResource>
    Ma question est la suivante : je veut avoir les nombre de tous les `writtenForm` de l'élément `Lemma` qui ont plusqu'une seul mot classé selon leur `partOfSpeech`.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Déjà, je te conseille StAX plutôt que SAX, qui sera plus simple à utiliser.

    Ensuite, je ne suis pas très sûr de comprendre ce dont tu parles : c'est quoi un mot classé selon son 'partOfSpeech' ? C'est quoi l'attribut pour le mot ? Que signifie classé par son 'partOfSpeech' ? Quand tu parles de "les nombres de ", tu veux dire le "nombre de" (comptage) ou les valeurs se trouvant dans l'attribut writtenForm (soit des codes de caractères à priori).

    A priori, je dirais qu'une map, avec un compute pour écrire dedans le compteur devrait le faire, ensuite un stream avec filter pour récupérer ce qui on plus d'un mot classé...

    Par exemple, pour récupérer les partOfSpeech de Lemma qui se trouve plus de 5 fois dans le fichier :
    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
    Map<String, Integer> counter=new HashMap<>();
     
    try(InputStream inputStream = Files.newInputStream(Paths.get(nomfichier))) {
        XMLStreamReader xmlReader = XMLInputFactory.newFactory().createXMLStreamReader(inputStream);
        try {
            while ( xmlReader.hasNext() ) {
                switch( xmlReader.next() ) {
                case XMLStreamReader.START_ELEMENT:
                     switch(xmlReader.getLocalName()) {
                         case "Lemma":
                              counter.compute(xmlReader.getAttributeValue(null, "partOfSpeech"),(k, v) -> (v == null) ? 1 : v+1);
                              break;
                         }
                     }
                     break;
         	    }
         	}
         finally {
    	xmlReader.close();
         }
      } catch (IOException | XMLStreamException e) {
    	e.printStackTrace();
    }
     
    List<String> list = counter.entrySet().stream().filter(e->e.getValue()>5).map(e->e.getKey()).collect(Collectors.toList());
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Par défaut
    Le fichier est très gand c'est pour ça que j'ai mentionné SAX parser. L’élément `Lemma` contient 4 types de `partOfSpeech` (n, v, a, r) donc le programme va conter selon le type, par exemple "100 writtenForm de type n / 200 writtenForm de type v / etc..." bien sur le programme va conter que les `writtenForm` qui ont plus que 2 mots. (le writtenForm sont écrits en arabe c'est pour ca qu'il sont mal afficher)

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    StAX permet de lire en flux les fichiers : il est justement tout indiqué pour lire des XML très grand, mais pas besoin d'implémenter un handler.

    Ensuite, je ne comprends toujours pas ce que veux pouvoir dire `writtenForm` qui ont plus que 2 mots : writerForm est un attribut qui contient une valeur. Quelle est la condition en Java qui indique que cette valeur correspond à "plus de 2 mots" ?

    Le code que je t'ai donné donne bien dans la map le nombre d'occurences de chaque valeur de partOfSpeech, si on affiche la map counter, on va avoir un truc comme ça :
    { "a'=123, "v"=245, "r"=21, "n"=122 }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Par défaut
    Oui, je sais et merci pour le code

    Ce que je veux moi c'est de conter les writerForm qui contient une chaine de caractaire ( c-d-a leurs valeurs) comporte plus que 2 mots

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par chenwaZi Voir le message
    Ce que je veux moi c'est de conter les writerForm qui contient une chaine de caractaire ( c-d-a leurs valeurs) comporte plus que 2 mots
    Ok, writerForm contient donc une phrase (en arabe donc), et tu ne veux que les phrases qui ont plus de 2 mots... On ne peut pas deviner que writerForm contient une phrase !!!

    Pour compter les mots dans une phrase, il faut découper la phrase en mots : on peut faire ça avec split. En français, il suffit de couper par rapport aux espaces et signe de ponctuation, ce qu'on peut faire comme ça :
    On précalcule un pattern au début : Pattern pattern = Pattern.compile("(\\p{Punct}|\\s)+")Le nombre de mots est donc : pattern.split(text).length, ou text est le texte.

    Donc dans le code que je t'ai indiqué il suffit d'ajouter la condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case "Lemma":
       if ( pattern.split(xmlReader.getAttributeValue(null,"writerForm")).length>2 ) {
           counter.compute(xmlReader.getAttributeValue(null, "partOfSpeech"),(k, v) -> (v == null) ? 1 : v+1);
       }
       break;
    };
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Manipulation d'un fichier XML avec java
    Par rourou25 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 15/05/2012, 09h37
  2. Réponses: 1
    Dernier message: 08/06/2008, 19h05
  3. [SAX] Génére un fichier XML avec SAX à partir d'un tableau de données
    Par flethiel dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 25/09/2007, 12h12
  4. [SAX] Je dois générer un fichier XML avec SAX
    Par moi95 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 24/01/2007, 12h22
  5. Manipulation d'un fichier XML avec Perl
    Par brahak dans le forum Modules
    Réponses: 3
    Dernier message: 01/05/2006, 22h36

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