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 :

Trouver une expression régulière pour les valeurs des noeuds XML


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Par défaut Trouver une expression régulière pour les valeurs des noeuds XML
    Bonjour,

    Admettons que j'ai un flux XML avec des caractères spéciaux:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <aaa&>val a</aaa&>
    <bbb>val b      &</bbb>

    Je voudrais remplacer le & dans toutes les valeurs de noeud mais dans aucune balise.

    Actuellement j'ai essayé ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String text = "&<balise & aa><a attr=\"3\">   &dfff&dfgdfg  &</a &></balise>aaa&aaa <ba&lise2>blabla2</ba&lise2>";
     
    String startWord = "[^(<[a-zA-Z0-9]*\\s)]";
    		String endWord = "[^(\\s[a-zA-Z0-9]*>)]";
    		String regex = "(?="+startWord+"|^)(\\&)(?="+endWord+"|$)";
    		String formattedText = text.replaceAll(regex, "[ET]");
    		System.out.println("Regex : " + regex);
    		System.out.println(" > " + formattedText);
    Après transformation, ma console m'affiche ce résultat:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    > [ET]<balise & aa><a attr="3">   [ET]dfff[ET]dfgdfg  [ET]</a &></balise>aaa[ET]aaa <ba[ET]lise2>blabla2</ba[ET]lise2>

    <ba[ET]lise2> --> c'est pas bon

    J'ai beau me creuser la tête, je n'arrive désesperément pas à trouver la bonne expression pour mon besoin.. Est ce que l'un d'entre vous aurait une idée?

    Merci.
    Motin

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    Bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    String contenuDuFichierXML =...
    StringBuilder resultat = new StringBuilder();
    boolean estDansUneBalise = false;
    for(char c : contenuDuFichierXML.toCharArray()){
        if(c == '<')estDansUneBalise = true;
        if(c == '>')estDansUneBalise = false;
        if(!estDansUneBalise && c == '&'){
            resultat.append("[ET]");
        }
        else{
            resultat.append(c);
        }
    }
    devrait marcher.
    Les expressions régulières c'est bien mais parfois c'est plus simple de le faire à la main...
    Sinon tu peut aussi utiliser un parseur xml et faire ton replaAll sur le (get/set)Text.

  3. #3
    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
    Mise à part l'utilisation arbitraire de chevrons formant un genre de format à balises, tout ceci n'a rien à voir avec du XML.

    En XML:
    - Pas d'espace ou de & dans les noms de balise.
    - À moins d'être dans une balise <![CDATA[ ]]>, le & doit faire une entité (genre &nbsp; ou & #x20; ou ce genre de choses,) c'est la règle.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Par défaut
    Bonjour,

    Merci pour vos réponses.
    En fait, j'ai donné un mauvais exemple, le problème c'est que notre projet reçoit un flux XML qui ne peut pas être parsé si les valeurs de noeuds possèdent des caractères spéciaux.
    Du coup, le but du jeu est de trouver une solution général pour remplacer les caractères tels que &, ", <, >, ' par leurs représentations HTML dans les valeurs de noeuds. avant de l'envoyer à notre parseur.
    Effectivement, les balises ne comportent pas de &, mais elles possèdent forcément des < et >.

    D'où l'intêret de retrouver les éléments hors des balises.

    La première solution fonctionne dans le cas des &, mais si je veux transformer les < et > hors balises, ça ne fonctionnera pas.

  5. #5
    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
    Comment diable croyais-tu pouvoir faire la différence entre un < qui commence une balise et un < qui fait partie du contenu d'une balise ?

    Tous ces trucs-là sont bien entendu du XML mal formé et en principe il faut le rejeter et dire à l'envoyeur de faire du XML bien formé à la place.
    Mais bon, je peux comprendre qu'on puisse pas toujours discuter.
    Par contre, la question reste : je vois pas bien comment faire la différence entre un < qui fait partie du contenu et un < qui commence une balise.

    (À noter que le > ne devrait poser problème à aucun parseur, c'est tout à fait bien formé.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    À la limite, si on connait d'avance toutes les balises possibles, on peut faire une recherche sur les "<" qui ne commencent pas une chaine de type "<baliseConnue".

Discussions similaires

  1. Extraire les valeurs des noeuds xml en java
    Par Mohcine.nb dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 28/04/2014, 14h27
  2. Réponses: 8
    Dernier message: 13/10/2008, 20h26
  3. Pb d'expression Réguliére : pour les amateurs
    Par tnodev dans le forum Général Java
    Réponses: 10
    Dernier message: 16/02/2008, 22h14
  4. [RegEx] Expression régulière pour les retours de lignes
    Par Marshall_Mathers dans le forum Langage
    Réponses: 3
    Dernier message: 01/03/2007, 09h42
  5. Réponses: 2
    Dernier message: 14/06/2006, 10h34

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