Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Autres Mapper fichier XML dans Excel avec TLE

FS69

XLDnaute Nouveau
Bonjour,

Je suis un novice en XML et Excel aussi, je dois constituer un fichier csv basé sur un XML afin de faire correspondre les données du XML dans la colonne/position attendue.

Le fichier XML contient des "name" et des "value". chaque "name" à une "value" associée et séparé par un "TLE"

Comment puis je faire pour que chaque "name" puisse être identifiée comme une zone de mappage et qu'ainsi les "value" soient positionnées


 
Solution
re
c'est pas une ligne qu'il faut changer
on garde le moteur on met un carbu double corps on remplace les cable par l'hydrolique
on modifie un peu ici et là
on la transform en fonction
on ajoute une sub de pilotage (grand guidon)

choisi le dossier dans la boite de dialogue
VB:
Sub test()
    Dim sfolder$, fichier, header$, y&, file$
    fichier = ThisWorkbook.Path & "\compilation.csv"
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = -1 Then ' if OK is pressed
            sfolder = .SelectedItems(1)
            Else: Exit Sub
        End If
    End With
    header = "NumeroCient;NumeroContrat;NumeroSinistre;Identifiant Unique document;Code Maquette;Date de creation Document;Civilité;Nom;Prenom;" & _...

mromain

XLDnaute Barbatruc
Bonjour FS69, chris, le forum,

@FS69 :
Je t'avoue ne pas trop comprendre ce que tu veux quand tu dis :
je dois constituer un fichier csv basé sur un XML afin de faire correspondre les données du XML dans la colonne/position attendue
Vu que tu as Excel 2016, tu peux donc utiliser PowerQuery pour récupérer les informations de ton fichier XML sous cette forme :

Avec cette requête :
PowerQuery:
let
    pathXml = "C:\...\FichierSource.xml",
    SourceXml = Xml.Tables(File.Contents(pathXml)),
    TLE = SourceXml{0}[TLE],
    ValueDéveloppée = Table.ExpandTableColumn(TLE, "Value", {"Element:Text"}, {"Value"}),
    ValueNettoyée = Table.TransformColumns(ValueDéveloppée,{{"Value", Text.Trim, type text}}),
    PivotColumn = Table.Pivot(ValueNettoyée, List.Distinct(ValueNettoyée[Name]), "Name", "Value")
in
    PivotColumn
Tu peux aussi supprimer la dernière étape PivotColumn si tu préfères récupérer tes données ainsi :

C'est un début, peut-être que ça t'aidera à arriver à ton but.

Sinon, n'hésite pas à donner plus d'infos et des fichiers exemples.

A+
 

FS69

XLDnaute Nouveau
Bonjour,

Tout d'abord merci pour votre réponse, je vais essayer votre proposition.

Concernant ma demande, je vais essayer de l'expliciter plus clairement :
Je vais recevoir dans différents répertoires des fichiers au format XML, chaque répertoire peu avoir des fichiers avec des balises spécifiques.

La façon dont sont constitués les XML sont :
une balise "name"
et une autre "value".

Or, pour mon besoin, la valeur présente dans la balise "name" devrait être une balise et la "value" la valeur associée à cette balise.

J'ai donc des xml se présentant comme ceci :

<Document>
<Filename>G:\GED\Ondemand\ARIO16\2003\03\01234567-0123456789-EB90-08_03_2003.pdf</Filename>
<TLE>
<Name>datedoc</Name>
<Value>08/03/2003</Value>
</TLE>
<TLE>
<Name>numadh</Name>
<Value> 0123456789</Value>
</TLE>
<TLE>
<Name>numcli</Name>
<Value>01234567 </Value>
</TLE>
<TLE>
<Name>cciv</Name>
<Value>MME </Value>
</TLE>
<TLE>
<Name>nom1</Name>
<Value>MAUD XXXXXXX </Value>
</TLE>
<TLE>
<Name>nom2</Name>
<Value> </Value>
</TLE>
<TLE>
<Name>cetat</Name>
<Value>EB90</Value>
</TLE>
</Document>

Alors que je devrais plutôt avoir ceci pour mon besoin :
<Document>
<Filename>G:\GED\Ondemand\ARIO16\2003\03\01234567-0123456789-EB90-08_03_2003.pdf</Filename>
<TLE>
<datedoc>08/03/2003</datedoc>
</TLE>
<TLE>
<numadh> 0123456789</numadh>
</TLE>
<TLE>
<numcli>01234567 </numcli>
</TLE>
<TLE>
<cciv>MME </cciv>
</TLE>
<TLE>
<nom1>MAUD XXXXXXX </nom1>
</TLE>
<TLE>
<nom2> </nom2>
</TLE>
<TLE>
<cetat>EB90</cetat>
</TLE>
</Document>

L'objectif étant de pouvoir constituer un csv avec les données issues du xml et les données positionnées "au bon endroit"
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour
un petit exemple de lecture en vba
VB:
Sub test()
    Dim t$, Nodexs As Object
    With CreateObject("microsoft.xmldom")
        .Load "C:\Users\patricktoulon\Desktop\exemple.xml"
        Set Nodexs = .getelementsbytagname("Name")
        For i = 0 To Nodexs.Length - 1
            t = t & Nodexs(i).Text & ":" & vbTab & Nodexs(i).NextSibling.Text & vbCrLf
        Next
    End With
    MsgBox t
End Sub
parti de là il est facile d'organiser une restitution dans un ordre particulier et d'en faire une fonction générique
qui pourrait scruter tout un dossier et prendre tout les fichiers en un seul coup
 

FS69

XLDnaute Nouveau


Merci pour votre proposition de lecture des données mais je dois inclure les données dans un csv au format contraint ainsi au delà de la lecture je dois réussir à positionner les valeurs dans une zone attendue
par exemple la civilité CCIV devra aller en colonne H
 

patricktoulon

XLDnaute Barbatruc
bon je l'ai fait
voici un exemple qui te transforme ton xml en csv
VB:
Sub test()
    Dim t, Nodexs As Object, x&, header, tabhead, tb$(), i, myfile$, myfileCsV$
    header = "NumeroCient;NumeroContrat;NumeroSinistre;Identifiant Unique document;Code Maquette;Date de creation Document;Civilité;Nom;Prenom;" & _
            "branche;famille;Sous famille;Sous Famille2;Libellé Produit;Univers;sendflux;sourceged;libelléstatut;docencrys;" & _
            "IDAQUISIT;IDAQUISIT;IDAQUISIT;Chemin d'acces au fichier"
    tabhead = Split(header, ";")
    ReDim tb(UBound(tabhead))
    myfile = "C:\Users\patricktoulon\Desktop\exemple.xml"'chemin  à  adapter'
    myfileCsV = Replace(myfile, ".xml", ".csv")'chemin  à  adapter'

    With CreateObject("microsoft.xmldom")
        .Load myfile
        Set Nodexs = .getelementsbytagname("Name")
        For i = 0 To Nodexs.Length - 1
            ' t = t & Nodexs(i).Text & ":" & vbTab & Nodexs(i).NextSibling.Text & vbCrLf

            Select Case Nodexs(i).Text
                Case "datedoc": tb(5) = Nodexs(i).NextSibling.Text
                Case "numadh": tb(1) = Nodexs(i).NextSibling.Text
                Case "numcli": tb(0) = Nodexs(i).NextSibling.Text
                Case "cciv": tb(6) = Nodexs(i).NextSibling.Text
                Case "nom1": tb(8) = Nodexs(i).NextSibling.Text
                Case "nom2": tb(7) = Nodexs(i).NextSibling.Text
                Case "cetat": tb(4) = Nodexs(i).NextSibling.Text
            End Select

        Next
   tb(UBound(tb)) = .getelementsbytagname("*")(1).Text
            x = FreeFile: Open myfileCsV For Output As #x: Print #x, header & vbCrLf & Join(tb, ";"): Close #x
 End With
    
End Sub
 

FS69

XLDnaute Nouveau
Merci beaucoup !

C'est presque parfait, j'ai fait le test sur un fichier XML mais je n'ai qu'une seule ligne correspondant à la dernière ligne et dans chemin d'accès figure le filename + les lignes de la 1e ligne
 

patricktoulon

XLDnaute Barbatruc
heu... c'est quoi cette capture c'est pas le résultat que tu doit avoir
alors il y a deux solutions
soit tes xmls n'ont pas tout a fait la même structure
soit ben je sais
donne moi quelques xml pour vérifier
 

Discussions similaires

Réponses
10
Affichages
404
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…