Skip to content

xml.diff

Description

Recherche et signale les différences entre deux arbres XML.

La sortie contient des balises <ins> et <del> définies sous un namespace spécifiques afin que ces dernières n'interfèrent pas avec les éventuelles autres balises <ins> et <del> déjà présentes dans l'arbre XML.

Syntaxe

xml.diff( old , new [ , options ] )

Paramètres

old string
Arbre XML d'origine
new string
Arbre XML modifié à comparer avec old
options map

Map d'options. Les options reconnues sont:

namespace
Flag true/false indiquant si l'algorithme doit tenir compte des namespaces lors de la comparaison. Par défaut le paramètre a la valeur true.
whitespace

Type de traitement des espaces. Le paramètre peut prendre les valeurs suivantes:

  • compare : Les espaces sont conservés durant le processus et sont comparés.
  • ignore : Les espaces sont ignorés.
  • preserve : Les espaces doivent être préservés, c'est-à-dire qu'ils seront chargés et restitués lors de la mise en forme, mais l'algorithme peut les considérer comme équivalents et ne signalera pas les différences entre les espaces blancs.

Par défaut la valeur est compare.

granularity

Indique comment découper et comparer les arbres xml. Les valeurs possibles sont:

  • character : Les différences sont signalées au niveau du caractère.
  • text : Les différences sont signalées au niveau du texte entier
  • word : Les différences sont signalées au niveau du mot.
  • space_word : Les différences sont signalées au niveau des mots, mais peuvent inclure l'espace qui précède.
  • punctuation : Les différences sont signalées en comparant le texte entre les signes de ponctuation. C'est plus précis que le texte, mais moins précis que le mot.

Par défaut la valeur est space_word.

Retour

Retourne une chaîne de caractères reprenant les modifications apportées au texte.

Exemple

Exemple d'utilisation de la méthode pour comparer des chaînes de caractères.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var oldText = "Ceci est un bel exemple de texte sans modification.";
var newText = "Ceci est un nouvel exemple de texte avec quelques modifications.";

var res = $xml.diff("<root>" & $xml.escape(oldText) & "</root>",
                    "<root>" & $xml.escape(newText) & "</root>");
$logger.info(cleanXml(res));

function cleanXml(text) {
    var result = $string.replace(
                 $string.replace(
                 $string.replace(
                 $string.replace(
                 $string.replace(
                 $string.replace(
                 $string.replace(
                 $string.replace(&text,
                     // retire les namespaces...
                     "<diff:ins>", "<ins>"),
                     "</diff:ins>", "</ins>"),
                     "<diff:del>", "<del>"),
                     "</diff:del>", "</del>"),
                     // ...et sans des enchaînements inutiles
                     "<ins></ins>", ""),
                     "<del></del>", ""),
                     "</ins><ins>", ""),
                     "</del><del>", "");

    // on retire les balises <root> de début et de fin
    var p1 = 1 + $string.indexOf(&result, ">"),
        p2 = $string.lastIndexOf(&result, "</root>");
    return $string.substring(&result, p1, p2);
}

Le code génère la valeur suivante:

Ceci est un<del> bel</del><ins> nouvel</ins> exemple de texte<del> sans 
modification</del><ins> avec quelques modifications</ins>.