Инструмент для поиска дубликатов разделов в текстовом (XML) файле? - PullRequest
0 голосов
/ 29 октября 2008

У меня есть файл XML, и я хочу найти узлы, которые имеют дубликаты CDATA. Существуют ли какие-либо инструменты, которые могут помочь мне сделать это?

Я бы согласился с инструментом, который обычно делает это для текстовых документов.

Ответы [ 5 ]

2 голосов
/ 23 января 2009

Вот первая попытка, написанная на Python и использующая только стандартные библиотеки. Вы можете улучшить его многими способами (обрезать начальные и конечные пробелы, вычислять хеш текста, чтобы уменьшить требования к памяти, лучше отображать элементы, их номер строки и т. Д.):

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]))

Если вы дадите ему этот XML-файл:

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

будет выводиться:

"Hop" is a duplicate: found in ['<bar>', '<und>']
0 голосов
/ 21 июля 2016

Очень похожий вопрос (, заданный через год после этого ), содержит несколько ответов с очень хорошими инструментами для разметки фрагментов в одном файле, включая Atomiq .

0 голосов
/ 23 января 2009

не легко. Моя первая мысль - XSLT, но ее трудно реализовать. Вам нужно будет пройти через каждый узел, а затем выполнить выбор XPATH на каждом узле с одинаковыми данными. Это найдет их, но вы в конечном итоге также обработаете все узлы с одинаковыми данными (т. Е. Не сможете отследить, какие данные узла вы уже обработали, и игнорировать их). Вы могли бы сделать это с реальным языком программирования, но это вне моего опыта.

0 голосов
/ 23 января 2009

Вы можете написать простое приложение на C #, которое использует Linq, чтобы дважды прочитать все узлы как отдельные объекты, а затем найти все равные значения.

0 голосов
/ 30 октября 2008

никогда не слышал ни о чем подобном, но это может быть интересной задачей - написать такую ​​программу на основе словарного кодера , используемого в архиваторах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...