0

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

我可以使用通常用于文本文档的工具。

4

5 回答 5

2

这是第一次尝试,用 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>']
于 2009-01-23T16:33:24.900 回答
0

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

于 2009-01-23T15:50:55.627 回答
0

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

于 2009-01-23T15:53:22.780 回答
0

never heard about anything like that, but it might be an intresting task to write such a program based on a dictionary coder as used in archivers.

于 2008-10-29T21:18:43.863 回答
0

一个非常相似的问题在此问题之后一年提出)有一些答案,其中包含用于区分同一文件中的块的非常好的工具,包括Atomiq

于 2016-07-21T19:38:41.410 回答