Question Comparaison XML

Plus d'informations
il y a 15 ans 8 mois #7251 par Guerric
Comparaison XML a été créé par Guerric
Bonjour à tous,

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.

Plus d'informations
il y a 15 ans 8 mois #7255 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Comparaison XML
Salut,
Gulrick écrit:

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

Utiliser un programme externe, par exemple Fc.exe ou DiffMerge de SourceGear. Ce dernier propose un fichier de résulat dans un 'format unifié' .
[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.

Plus d'informations
il y a 15 ans 8 mois #7275 par Guerric
Réponse de Guerric sur le sujet Re:Comparaison XML
Je vais regarder ça, c'est mon maitre de stage qui m'a donné ca a faire, en powershell car la boite l'utilise beaucoup, mais bon ca me parait bien compliqué pour pas grand chose en effet, merci de ton aide, je vais lui suggérer cette solution

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 8 mois #7277 par Régis LOUIS
Réponse de Régis LOUIS sur le sujet Re:Comparaison XML
Pourquoi ne pas utiliser la cmdlet Compare-Object ?

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.

Plus d'informations
il y a 15 ans 8 mois #7278 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Comparaison XML
rnglouis écrit:

Pourquoi ne pas utiliser la cmdlet Compare-Object ?

Parce que le besoin est le suivant :
Gulrick écrit:

Comment récupérer les numéros de lignes d'un fichier

rnglouis écrit:

Charger chaque fichier XML dans deux variables
Comparer ces deux variables et sortir la différence dans une 3e variable.

Oui, mais ici ça ne fonctionne pas :
[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.

Plus d'informations
il y a 15 ans 8 mois #7282 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Comparaison XML
Concernant les tests, en voici un qui peut poser problème.
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.

Temps de génération de la page : 0.110 secondes
Propulsé par Kunena