在文本(XML)文件中查找重复部分的工具?

在文本(XML)文件中查找重复部分的工具?,xml,text,find,duplicates,Xml,Text,Find,Duplicates,我有一个XML文件,我想找到具有重复CDATA的节点。有什么工具可以帮助我做到这一点吗 我可以使用一个工具来处理文本文档。从来没有听说过类似的事情,但是基于archivers中使用的方法编写这样的程序可能是一项有趣的任务。不容易。我的第一个想法是XSLT,但它很难实现。您必须遍历每个节点,然后对具有相同数据的每个节点执行XPATH选择。这会找到它们,但以后也会处理所有具有相同数据的节点(即,无法跟踪已处理的节点数据并忽略它)。你可以用一种真正的编程语言来实现这一点,但这超出了我的经验。你可以编写

我有一个XML文件,我想找到具有重复CDATA的节点。有什么工具可以帮助我做到这一点吗


我可以使用一个工具来处理文本文档。

从来没有听说过类似的事情,但是基于archivers中使用的方法编写这样的程序可能是一项有趣的任务。

不容易。我的第一个想法是XSLT,但它很难实现。您必须遍历每个节点,然后对具有相同数据的每个节点执行XPATH选择。这会找到它们,但以后也会处理所有具有相同数据的节点(即,无法跟踪已处理的节点数据并忽略它)。你可以用一种真正的编程语言来实现这一点,但这超出了我的经验。

你可以编写一个简单的C应用程序,使用Linq将所有节点作为独立的实体读取两次,然后找到所有相等的值。

这是第一次尝试,用Python编写,只使用标准库。您可以通过多种方式对其进行改进(修剪前导和结尾空格、计算文本哈希以减少内存需求、更好地显示元素及其行号等):

将xml.etree.ElementTree导入为ElementTree
导入系统
def打印元素(元素):
返回“%element.tag”
如果len(sys.argv)!=2:
打印>>sys.stderr,“用法:%s文件名”%sys.argv[0]
系统出口(1)
filename=sys.argv[1]
tree=ElementTree.parse(文件名)
root=tree.getroot()
块={}
iter=root.findall('.//*'))
对于iter中的元素:
如果element.text分块显示:
块[element.text]。追加(element)
其他:
块[element.text]=[element,]
对于文本块:
如果len(块[文本])大于1:
打印“\%s\”重复:在%s”中找到%\
(文本,映射(打印元素,块[文本])
如果给它这个XML文件:

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

霍普盖夫
单足蹦跳
它将输出:

"Hop" is a duplicate: found in ['<bar>', '<und>']
“Hop”是一个重复项:在['',]中找到

(在这篇文章一年后被问到)有一些答案,其中包括非常好的工具,用于在同一个文件中区分块,包括。

这很酷,我感谢您的额外努力!看起来这只适用于根级别的节点,不是吗?当然不是。由于XPath表达式的缘故。//*它应该处理每个元素。