我有一个XML文件,我想查找具有重复CDATA的节点。是否有任何工具可以帮助我做到这一点?
我可以使用一种通常用于文本文档的工具。
答案 0 :(得分: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>']
答案 1 :(得分:0)
从来没有听说过这样的事情,但是根据档案馆中使用的dictionary coder编写这样的程序可能是一项有趣的任务。
答案 2 :(得分:0)
不容易。我的第一个想法是XSLT,但它很难实现。您必须遍历每个节点,然后在具有相同数据的每个节点上执行XPATH选择。那会找到它们,但是你最后也会用相同的数据处理所有节点(也就是说,无法跟踪你已经处理过的节点数据并忽略它)。你可以使用真正的编程语言来完成它,但这超出了我的经验。
答案 3 :(得分:0)
您可以编写一个简单的C#应用程序,它使用Linq将所有节点作为单独的实体读取两次,然后查找所有相等的值。
答案 4 :(得分:0)
A very similar question(在这一个之后一年提出问题)有一些非常好的工具可以在同一个文件中区分块,包括Atomiq。