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

XML/XSL et SOAP Discussion :

RegEX Notepad++ pour un fichier XML


Sujet :

XML/XSL et SOAP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 12
    Points : 14
    Points
    14
    Par défaut RegEX Notepad++ pour un fichier XML
    Bonjour à tous,

    J'ai cherché partout sans succès une solution à mon problème alors je m'en remets à vous

    J'ai un fichier XML contenant des milliers de produits avec l'architecture suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="utf-8" ?>
    <Products ID="xxx">
    <Product id="1"><CategoryPath></CategoryPath><Price>23.90 EUR</Price><Deeplinks>http://www.pageduproduit.html/jaunefluo</Deeplinks><Details><Title>Article jaune fluo</Title></Details></Product>
    <Product id="2"><CategoryPath></CategoryPath><Price>23.90 EUR</Price><Deeplinks>http://www.pageduproduit.html/rouge</Deeplinks><Details><Title>Article rouge</Title></Details></Product>
    <Product id="3"><CategoryPath></CategoryPath><Price>23.90 EUR</Price><Deeplinks>http://www.pageduproduit.html/jaunefluo</Deeplinks><Details><Title>Article jaune fluo</Title></Details></Product>
    <Product id="4"><CategoryPath></CategoryPath><Price>23.90 EUR</Price><Deeplinks>http://www.pageduproduit.html/vertpomme</Deeplinks><Details><Title>Article vert pomme</Title></Details></Product>
    ...
    </Products>
    Chaque produit à une ID unique et il n'y a donc pas de doublons à proprement dit.

    Néanmoins comme vous pouvez le voir dans mon exemple, il y a 2x le produit jaune fluo (même titre et même Deeplinks en ID 1 et 3)
    Dans mon cas d'espèce c'est parce qu'il s'agit du même produit mais d'une différente taille (S M L XL...) => ce qui est géré en JS sur la page de destination à laquelle je n'ai pas accès.

    J'aimerais avec Notepad++ trouver la formule me permettant d'éliminer ces "pseudos-doublons" car il n'y a aucun intérêt pour moi de les afficher plusieurs fois.
    Ainsi la fonction que je cherche à faire doit me permettre de ne garder qu'un seul produit ayant des caractéristiques identiques en se basant sur les balise <Title> et <Deeplinks>

    J'espère m'être fait comprendre
    Merci d'avance

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    En partant du principe que chaque produit occupe une ligne et une seule, que les contenus des tags Deeplinks et Title doivent être les mêmes, j'en conclu que deux lignes équivalentes sont identiques (au moins) de la balise fermante Price jusqu'à la fin de la ligne.

    Tu peux faire un "Remplacer tout" par rien avec cette pattern (et une version pas trop vieille de Notepad++):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (^<Product id(?:[^\n<]+|<(?!/Price>))++)([^\r\n]+)\R(?=(?>.*\R)*?(?1)\2)
    Détails de la pattern:

    C'est une pattern utilisant des notions assez avancées, mais à cœur vaillant rien d'impossible.
    Notepad++ utilise le même moteur de regex que PHP (ou le langage R), c'est à dire le moteur PCRE, les caractéristiques sont donc à peu prés les mêmes.

    Quelques éléments de la pattern:
    • ^ est l'ancre de début de ligne (notepad++ est par défaut en mode multiline)
    • \R est un alias pour les différents types de nouvelle ligne (CRLF sous Windows, LF sous UNIX, CR anciennement sous Mac ...)
    • (?=...) est un test avant (lookahead)
    • (?!...) est un test avant négatif (negative lookahead)
    • \2 est une backreference, c'est à dire le contenu capturé par le groupe de capture 2.
    • (?1) est un alias pour la sous-pattern définie dans le groupe de capture 1.
    • ++ est un quantificateur possessif
    • (?>...) est un groupe atomique


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (                              # groupe de capture 1
        ^<Product id               # début de la ligne
        (?:[^\n<]+|<(?!/Price>))++ # tous les caractères jusqu'à "</Price>"
    )
    ([^\r\n]+)                     # groupe de capture 2: tous les caractères jusqu'à la fin de la ligne
    \R                             # nouvelle ligne
    (?=                            # suivit par
        (?>.*\R)*?                 # toutes les lignes jusqu'à
        (?1)\2                     # la prochaine ligne similaire
    )

    Maintenant, cette méthode peut grimper en complexité si le nombre de ligne est élevé, si les lignes similaires sont éloignées les unes des autres, et s'il y a peu de doublons. Autre chose, cette méthode parcourt le fichier de haut en bas et, à chaque doublon trouvé, va éliminer la ligne la plus haute des deux.

    Face au même problème, je passerais plutôt par un langage de programmation pour faire ce travail. Quelque chose comme:

    1. extraction de la liste des nœuds enfant de Products avec un parseur XML
    2. création d'une structure de données permettant un dédoublonnage facile avec les fonctions disponibles du langage
    3. dédoublonnage
    4. reconstruction du nœud Products
    5. remplacement du nœud Products
    6. enregistrement
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 12
    Points : 14
    Points
    14
    Par défaut Merci beaucoup !
    Tu es vraiment un crack !
    Ça fonctionne impec', mon ordinateur rame mais en s'armant de patience ça fait exactement ce que je voulais.

    J'aurais été incapable de créer cette fonction, pourtant maintenant je la comprends puisque tu l'as bien expliquée en détail.
    Un grand merci à toi,

    Excellentes fêtes à tous !

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

Discussions similaires

  1. VBScript : création base Access pour import fichier XML
    Par abertaud dans le forum VBScript
    Réponses: 1
    Dernier message: 02/04/2007, 14h34
  2. Réponses: 1
    Dernier message: 26/01/2007, 09h38
  3. [encoding] Problème pour les fichiers XML avec notepad
    Par lehamster dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 21/11/2006, 15h56
  4. script pour parsing fichier xml
    Par Melvine dans le forum Modules
    Réponses: 4
    Dernier message: 06/10/2006, 18h47
  5. [XML - XSLT] Plusieurs xslt pour un fichier xml
    Par Laure888 dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 17/03/2006, 15h16

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