Suppression de lignes dans un fichier .xml

heparti

XLDnaute Occasionnel
Bonjour,

Je dois traiter des fichiers .xml qui font plusieurs milliers de lignes.

Ce traitement consiste en la suppression de plusieurs centaines de lignes se trouvant entre deux balises (par exemple : <NOM>....</NOM>).

J'ai dans un fichier excel la liste des données qui me permettent de recherches ces ensembles de lignes.

Actuellement, je recherche la référence qui m'intéresse avec notepad++ en faisant CTRL+F, puis une fois trouvé je remonte jusqu'à la base de début <NOM>, je clique sur le '-' pour regrouper toutes les lignes et je supprime ce groupe de lignes, ainsi de suite.

Je souhaite donc automatiser ces suppressions en prenant la base des données à supprimer dans un fichier excel et que ça recherche automatiquement dans le fichier .xml puis suppression automatique des environ 120 lignes dans le fichier .xml.

Je passe environ 2 jours pour supprimer les 1700-2000 groupes de lignes manuellement, incluant le risque d'erreurs de manipulation. Même si la solution à ce problème prend une demi journée, ce n'est pas un problème :D

Merci.
 

tototiti2008

XLDnaute Barbatruc
Re : Suppression de lignes dans un fichier .xml

Bonjour heparti,

Personnellement, le XML n'est pas ma spécialité, je sais juste que c'est une présentation des données sous forme de balises, un peu comme HTML, sauf que les balises sont libres
Je n'ai malheureusement pas non plus Notepad++, donc les '-' pour regrouper le contenu d'une balise, je ne sais pas trop comment ça marche (même si j'ai une idée)

Aurais-tu un fichier exemple à nous fournir et préciser un peu plus le traitement attendu en fonction du contenu recherché ?
 

heparti

XLDnaute Occasionnel
Re : Suppression de lignes dans un fichier .xml

Merci tototiti2008 pour ton message, je pourrai récupérer un fichier lundi et en mettre une partie à disposition. Je n'ai malheureusement pas pensé à en copier un sur clef usb avant de partir en week-end.
 

heparti

XLDnaute Occasionnel
Re : Suppression de lignes dans un fichier .xml

Me revoici avec un peu de retard...

Ci-dessous, une partie d'un fichier .xml.

Il y a plusieurs parties identiques ou plus longues selon la composition de base de la source. Je souhaite donc supprimer de la première balise <IFROC> à la dernière balise </IFROC> selon la donnée se trouvant entre les balises <MAT> et </MAT> soit en saisissant à la main la donnée ou en faisant un copier coller, ou le mieux serait la suppression via une liste excel de toutes les données "MAT" afin d'automatiser cette suppression de masse.

<IFROC>
<IdentificationROC>
<ORG>
<*>données</*>
<*>données</*>
<MAT>données</MAT>
</ORG>
<Partenaire>
<*>données</*>
<*>données</*>
</Partenaire>
<DemandeROC>
<*>données</*>
<*>données</*>
</DemandeROC>
<DemandeRAC>
<DDEMRAC>
<*>données</*>
</DDEMRAC>
<NISTRAC>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
</NISTRAC>
</DemandeRAC>
</IdentificationROC>
<Personne>
<Identification>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
</Identification>
<DossierLEMO>
<*>données</*>
<*>données</*>
</DossierLEMO>
<prests>
<*>données</*>
<*>données</*>
<*>données</*>
</prests>
<prests>
<*>données</*>
<*>données</*>
<*>données</*>
</prests>
<DossierPE>
<*>données</*>
</DossierPE>
<Ressources>
<GRT>
<*>données</*>
<*>données</*>
<*>données</*>
</GRT>
<RM>
<GeneraliteRM>
<*>données</*>
<*>données</*>
</GeneraliteRM>
<DetailRM>
<*>données</*>
<*>données</*>
</DetailRM>
</RM>
<RM>
<GeneraliteRM>
<*>données</*>
<*>données</*>
</GeneraliteRM>
<DetailRM>
<*>données</*>
<*>données</*>
</DetailRM>
</RM>
<RM>
<GeneraliteRM>
<*>données</*>
<*>données</*>
</GeneraliteRM>
<DetailRM>
<*>données</*>
<*>données</*>
</DetailRM>
</RM>
</Ressources>
<MCDROCP>
<*>données</*>
<*>données</*>
<*>données</*>
</MCDROCP>
<Activite>
<*>données</*>
<*>données</*>
<*>données</*>
</Activite>
<PALIM>
<CREALI>
<*>données</*>
<*>données</*>
<*>données</*>
</CREALI>
</PALIM>
</Personne>
<DonneesAdministratives>
<SituationFamille>
<*>données</*>
<*>données</*>
</SituationFamille>
<Adresse>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
</Adresse>
</DonneesAdministratives>
<prestROC>
<SituationDossierROC>
<EtatDossierROC>
<*>données</*>
</EtatDossierROC>
</SituationDossierROC>
<DDROC>
<TCDROC>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
</TCDROC>
<MCDROC>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
</MCDROC>
<DCDROC>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
<*>données</*>
</DCDROC>
</DDROC>
</prestROC>
</IFROC>
 

tototiti2008

XLDnaute Barbatruc
Re : Suppression de lignes dans un fichier .xml

Bonjour heparti,

Pas sûr d'avoir bien compris.
La suppression n'aura lieu qu'entre les balises IFROC
Entre ces balises, il faut supprimer le contenu des balises MAT (balises comprises ?) mais visiblement pas toujours ?
 

heparti

XLDnaute Occasionnel
Re : Suppression de lignes dans un fichier .xml

Je vais essayer d'être le plus clair possible...

On part d'une famille pour laquelle tous les renseignements la concernant sont situées de la balise <IFROC> à </IFROC>.

Dans le fichier .xml, j'ai plusieurs milliers de familles et donc plusieurs milliers de "blocs" <IFROC> à </IFROC>.

J'ai une donnée qui me permet d'identifier cette famille, et cette donnée se situe entre les balises <MAT> et </MAT>.

A l'intérieur du fichier .xml, je dois supprimer quelques centaines de familles, soit autant de "blocs" <IFROC> à </IFROC> repérables par la donnée située entre <MAT> et </MAT>.

Il faut donc que soit supprimé, pour chaque famille concernée, de <IFROC> à </IFROC> compris.

Dans le fichier .xml, chaque bloc terminé enchaine immédiatement avec un autre bloc. Certains blocs sont de longueur différente selon la taille de la famille.

J'espère avoir été un peu plus clair dans mes explications, d'autant plus que je ne peut donner de contenu trop précis, les données n'étant pas communicables...
 

tototiti2008

XLDnaute Barbatruc
Re : Suppression de lignes dans un fichier .xml

Bonjour heparti,

un essai (à mettre dans un module)

Code:
Dim Lignes() As String, LignesCond() As String

Sub NettXML()
Dim FamMAT As String, AdrXML As String, AdrXMLTrait As String
Dim BoolIFROC As Boolean, BoolMAT As Boolean, BoolCons As Boolean
Dim LigXML As String, i As Long
Dim fs, f1, f2
    ReDim Lignes(1 To 1) 'Tableau des lignes XML à conserver
    ReDim LignesCond(1 To 1) 'Tableau des lignes XML à conserver sous condition
    FamMAT = "fam1" 'Famille pour laquelle le XML est supprimé
    AdrXML = "C:\temp\essai.xml" 'Adresse du fichier à traiter
    AdrXMLTrait = "C:\temp\essai2.xml" 'Adresse du fichier traité
    BoolIFROC = False
    BoolMAT = False
    BoolCons = False
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f1 = fs.OpenTextFile(AdrXML, 1, False, -2)
    Do Until f1.AtEndOfStream
        LigXML = f1.ReadLine
        If UCase(LigXML) = "<IFROC>" Then BoolIFROC = True
        If UCase(LigXML) = "</IFROC>" Then BoolIFROC = False
        If UCase(LigXML) Like "<MAT>*</MAT>" Then BoolMAT = True
        If Not BoolIFROC And Not BoolMAT Then
            If BoolCons Then
                Call AjoutCond
                If Lignes(1) <> "" Then ReDim Preserve Lignes(1 To UBound(Lignes) + 1)
                Lignes(UBound(Lignes)) = LigXML
            End If
            ReDim LignesCond(1 To 1)
            BoolCons = False
        ElseIf BoolIFROC And Not BoolMAT Then
            If LignesCond(1) <> "" Then ReDim Preserve LignesCond(1 To UBound(LignesCond) + 1)
            LignesCond(UBound(LignesCond)) = LigXML
        ElseIf BoolIFROC And BoolMAT Then
            If LigXML Like "*" & FamMAT & "*" Then
                BoolCons = False
            Else
                If LignesCond(1) <> "" Then ReDim Preserve LignesCond(1 To UBound(LignesCond) + 1)
                LignesCond(UBound(LignesCond)) = LigXML
                BoolCons = True
            End If
            BoolMAT = False
        End If
    Loop
    f1.Close
    Set f2 = fs.CreateTextFile(AdrXMLTrait, True)
    For i = LBound(Lignes) To UBound(Lignes)
        f2.WriteLine Lignes(i)
    Next i
    f2.Close
    Set f1 = Nothing
    Set f2 = Nothing
    Set fs = Nothing
End Sub

Sub AjoutCond()
Dim i As Long
    For i = LBound(LignesCond) To UBound(LignesCond)
        If Lignes(1) <> "" Then ReDim Preserve Lignes(1 To UBound(Lignes) + 1)
        Lignes(UBound(Lignes)) = LignesCond(i)
    Next i
End Sub

puis lancer NettXML
 

tototiti2008

XLDnaute Barbatruc
Re : Suppression de lignes dans un fichier .xml

Bonjour heparti,

Moi j'ai collé le contenu de ton exemple dans un fichier txt renommé en xml (message #5) à 3 reprises en modifiant ce qu'il y a entre les balises MAT et ça avait l'air de fonctionner...
Les balises <MAT> et </MAT> sont toujours sur la même ligne ? Pas trop d'idée comme ça, épluche le code pour voir où ça ne fonctionne pas....
 

heparti

XLDnaute Occasionnel
Re : Suppression de lignes dans un fichier .xml

Bonjour,

Oui, les balises <MAT> et </MAT> sont toujours sur la même ligne.

Sinon, je vais regarder le code pour essayer de trouver le problème. En fait, le fichier .xml généré comporte 2 lignes qui sont vides.

Je regarde ça et je te tiens au courant.
 

heparti

XLDnaute Occasionnel
Re : Suppression de lignes dans un fichier .xml

Je viens de tester à partir de l'exemple que j'ai donné plus haut, en le copiant/collant plusieurs fois à la suite dans le même fichier .xml, et et en mettant dans le fichier excel une liste de 3 données de référence entre les balises 'MAT' puis j'ai exécuté Nettxml.

Le fichier généré est également composé de 2 lignes qui sont vides.

Peux-tu mettre en pièce jointe les fichiers .xml et .xls que tu as utilisé pour effectuer ton test car là, je ne sais plus quoi faire :D
 

tototiti2008

XLDnaute Barbatruc
Re : Suppression de lignes dans un fichier .xml

Re,

Ou alors je n'ai rien compris (ce qui n'est pas impossible ;))

La macro attend le fichier essai.xml dans C:\temp, à modifier si ce n'est pas bon
 

Pièces jointes

  • essai.zip
    7.8 KB · Affichages: 51
  • essai.zip
    7.8 KB · Affichages: 52
  • essai.zip
    7.8 KB · Affichages: 52

heparti

XLDnaute Occasionnel
Re : Suppression de lignes dans un fichier .xml

J'ai compris, mais pas encore résolu le problème :D

En fait, tu entres "manuellement" dans le code la référence, soit 'fam1' dans ton exemple.

Ca fonctionne parfaitement, mais en fait, comment faire pour que le code aille chercher dans la colonne A, de la cellule A1 à Axxx les références et supprimer la famille dans laquelle se trouve cette référence dans le fichier .xml ?

Je ne sais pas modifier ton code pour changer :

Code:
    FamMAT = "fam1" 'Famille pour laquelle le XML est supprimé

ou alors ajouter dans le code la liste de plusieurs centaines de références à la suite...
 

Discussions similaires