2008-10-29 7 views

Répondre

0

jamais entendu parler de quelque chose comme ça, mais il pourrait être une tâche intéressante d'écrire un tel programme basé sur un dictionary coder utilisé dans les archives.

0

La description du problème est trop générale.

Pourriez-vous, s'il vous plaît, fournir un exemple spécifique: le document XML source et le résultat souhaité?

Cheers,

Dimitre Novatchev

0

pas facilement. Ma première pensée est XSLT mais c'est difficile à mettre en œuvre. Vous devez passer par chaque nœud et ensuite effectuer une sélection XPATH sur chaque nœud avec les mêmes données. Cela les trouverait, mais vous finiriez par traiter tous les nœuds avec les mêmes données plus tard (c'est-à-dire, aucun moyen de garder une trace des données de nœud que vous avez déjà traitées et de les ignorer). Vous pouvez le faire avec un vrai langage de programmation, mais c'est en dehors de mon expérience.

0

Vous pouvez écrire une application C# simple qui utilise Linq pour lire tous les nœuds deux fois en tant qu'entités distinctes, puis trouve toutes les valeurs égales.

2

Voici une première tentative, écrite en Python et utilisant uniquement des bibliothèques standard. Vous pouvez l'améliorer à bien des égards (garniture principale et se terminant espaces blancs, le calcul d'un hachage du texte pour diminuer requirments mémoire, affichage mieux des éléments, avec leur numéro de ligne, etc.):

import xml.etree.ElementTree as ElementTree 
import sys 

def print_elem(element): 
    return "<%s>" % element.tag 

if len(sys.argv) != 2: 
    print >> sys.stderr, "Usage: %s filename" % sys.argv[0] 
    sys.exit(1) 
filename = sys.argv[1]  
tree = ElementTree.parse(filename) 
root = tree.getroot() 
chunks = {} 
iter = root.findall('.//*') 
for element in iter: 
    if element.text in chunks: 
     chunks[element.text].append(element) 
    else: 
     chunks[element.text] = [element,] 
for text in chunks: 
    if len(chunks[text]) > 1: 
     print "\"%s\" is a duplicate: found in %s" % \ 
       (text, map(print_elem, chunks[text])) 

Si vous donnez ce fichier XML:

<foo> 
<bar>Hop</bar><quiz>Gaw</quiz> 
<sub> 
<und>Hop</und> 
</sub> 

sortie sera:

"Hop" is a duplicate: found in ['<bar>', '<und>'] 
+0

C'est cool, et j'apprécie l'effort supplémentaire! Il semblerait que cela ne fonctionne que pour les nœuds de niveau racine, n'est-ce pas? – duma

+0

Certainement pas. En raison de l'expression XPath .//*, il devrait traiter chaque élément. – bortzmeyer

0

A very similar question (demandé un an après celui-ci) a quelques réponses avec de très bons outils pour différencier les morceaux dans le même fichier, y compris Atomiq.

Questions connexes