【问题标题】:Tool to find duplicate sections in a text (XML) file?在文本(XML)文件中查找重复部分的工具?
【发布时间】:2010-09-19 21:06:06
【问题描述】:

我有一个 XML 文件,我想查找具有重复 CDATA 的节点。是否有任何工具可以帮助我做到这一点?

我可以使用一个通常对文本文档执行此操作的工具。

【问题讨论】:

    标签: xml text find duplicates


    【解决方案1】:

    这是第一次尝试,用 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>']
    

    【讨论】:

    • 这很酷,我感谢您付出的额外努力!看起来这仅适用于根级节点,不是吗?
    • 当然不是。由于 XPath 表达式 .//* 它应该处理每个元素。
    【解决方案2】:

    从未听说过这样的事情,但编写这样一个基于归档器中使用的dictionary coder 的程序可能是一项有趣的任务。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          A very similar question在这个问题一年后问)提供了一些非常好的工具来区分同一文件中的块,包括Atomiq

          【讨论】:

            猜你喜欢
            • 2018-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-27
            • 2016-08-04
            • 2010-12-26
            相关资源
            最近更新 更多