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>']
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
Certainement pas. En raison de l'expression XPath .//*, il devrait traiter chaque élément. – bortzmeyer