Question
Comparaison XML
- Guerric
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 20
- Remerciements reçus 0
Bon et bien j'ai une nouvelle mission et pas de moindre : comparer deux fichiers XML !
J'ai déjà fait quelques recherches mais c'est pas gagné !
Le but étant de générer un troisième fichiers avec les différences
Mon idée est de mettre dans ce fichiers les différences ainsi que les lignes auxquelles on les trouves!
C'est pas gagné je sais!
Je me pose alors plusieurs questions : Comment récupérer les numéros de lignes d'un fichier, et ensuite savoir quelle est la meilleure (et plus simple) marche à suivre pour se faire
Merci d'avance de votre aide
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Gulrick écrit:
Utiliser un programme externe, par exemple Fc.exe ou DiffMerge de SourceGear. Ce dernier propose un fichier de résulat dans un 'format unifié' .Je me pose alors plusieurs questions : Comment récupérer les numéros de lignes d'un fichier, et ensuite savoir quelle est la meilleure (et plus simple) marche à suivre pour se faire
[code:1]
&\"C:\Program Files\SourceGear\diffmerge\DiffMerge.exe\" --diff=g:\temp\diff.txt View-Localized.xml View-Local
ized2.xml
type diff.txt
#7c7
#< <maml:«»para>TODO Add Short description</maml:«»para>
# ---
# > <maml:«»para>TODO</maml:«»para>
# 13c13,14
# < <command:noun>Localized</command:noun>
# ---
# > <command:noun>test text modifié</command:noun>
# > <command:noun>test texte ajouté</command:noun>
[/code:1]
Ou encore utiliser une librairie C# spécialisé comme ici (après qq tests, le module proposé n'est pas tout à fait au point)
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Guerric
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 20
- Remerciements reçus 0
Connexion ou Créer un compte pour participer à la conversation.
- Régis LOUIS
- Hors Ligne
- Nouveau membre
-
- Messages : 14
- Remerciements reçus 0
Charger chaque fichier XML dans deux variables
Comparer ces deux variables et sortir la différence dans une 3e variable.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Parce que le besoin est le suivant :Pourquoi ne pas utiliser la cmdlet Compare-Object ?
Gulrick écrit:
rnglouis écrit:Comment récupérer les numéros de lignes d'un fichier
Oui, mais ici ça ne fonctionne pas :Charger chaque fichier XML dans deux variables
Comparer ces deux variables et sortir la différence dans une 3e variable.
[code:1]
$a=gc -path \"g:\temp\View-Localized.xml\"
$b=gc -path \"g:\temp\View-Localized2.xml\"
$res=Compare-Object $a $b -SyncWindow 80 -property line
$res[0]
# line SideIndicator
# ----
# <maml:«»para>TODO</maml:«»para> =>
[/code:1]
Car l'object renvoyé ne contient pas le numéro de ligne, de plus l'objet renvoyé est un type personnalisé :
[code:1]
$res[0].gettype()
#PSCustomObject
[/code:1]
On peut essayer une autre approche :
[code:1]
#La regex renvoie toutes les lignes
$a=select-string -path \"g:\temp\View-Localized.xml\" -pattern \".\"
$b=select-string -path \"g:\temp\View-Localized2.xml\" -pattern \".\"
$res=Compare-Object $a $b -SyncWindow 80 -property line -pass
$res[0]
#View-Localized2.xml:7: <maml:«»para>TODO</maml:«»para>
$res[0]|select *
#...
[/code:1]
On récupére bien le numéro de ligne et la propriété 'SideIndicator' est ajouté au type MatchInfo:
[code:1]
$res[0].gettype()
#
# IsPublic IsSerial Name BaseType
#
----
# True False MatchInfo System.Object
$Res|select filename,linenumber,line,side*
# Filename LineNumber Line SideIndicator
#
----
# View-Localized2.xml 7 <maml:«»para>TODO</m... =>
# View-Localized2.xml 13 <command:noun>test</... =>
# View-Localized2.xml 14 <command:noun>suite<... =>
# View-Localized.xml 7 <maml:«»para>TODO Ad... <=
# View-Localized.xml 13 <command:noun>Locali... <=
[/code:1]
Mais à la différence du format unifié on ne retrouve pas le détails (ajout/suppression), et on doit retravailler le résultat.
Voici le résultat d'une comparaison dans le format unifié :
[code:1]
&\"C:\Program Files\SourceGear\diffmerge\DiffMerge.exe\" --diff=g:\temp\diff.txt View-Localized.xml View-Localized2.xml -u
type diff.txt
# --- G:\temp\View-Localized.xml 2010-06-25 12:20:57.203000000 +0200
# +++ G:\temp\View-Localized2.xml 2010-06-25 12:48:18.468000000 +0200
# @@ -4,13 +4,14 @@
# <command:details>
# <command:name>View-Localized</command:name>
# <maml:description>
# - <maml:«»para>TODO Add Short description</maml:«»para>
# + <maml:«»para>TODO</maml:«»para>
# </maml:description>
# <maml:copyright>
# <maml:«»para />
# </maml:copyright>
# <command:verb>View</command:verb>
# - <command:noun>Localized</command:noun>
# + <command:noun>test</command:noun>
# + <command:noun>suite</command:noun>
# <dev:version />
# </command:details>
# </command:command>
[/code:1]
Quelques explications sur l'interprétation de ce résultat.
Compare-object peut peut-être faire l'affaire, reste à le vérifier au travers de nombreux tests, ce qui n'est pas nécessaire avec le soft externe diffmerge.
Je n'ai pas parlé de ce cmdlet pour un gain de temps.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Contenu du premier fichier :
[code:1]Ligne une
Ligne deux
Ligne trois
Ligne quatre[/code:1]
Contenu du second fichier :
[code:1]Ligne quatre
Ligne trois
Ligne deux
Ligne une[/code:1]
La comparaison de ces 2 fichiers avec Compare-object ne renvoi aucun résultat.
Ce cmdlet compare l'existence d'un objet d'un tableau dans un autre tableau, il ne tient pas compte du contexte, ici l'ordre des lignes.
Dans ce cas compare-object considére que les deux sources sont identiques, ce qui est un peu gênant...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Comparaison XML