2008-10-29 82 views

回答

0

從來沒有聽說過這樣的事情,但編寫這樣一個基於dictionary coder編程的程序可能是一件很有趣的任務。

0

該問題的描述過於籠統。

您能否提供一個具體的例子:源XML文檔和想要的結果?

乾杯,

Dimitre Novatchev

0

不容易。我的第一個想法是XSLT,但很難實現。您必須通過每個節點,然後在具有相同數據的每個節點上執行XPATH選擇。這會找到它們,但最終你會最終處理具有相同數據的所有節點(即,無法跟蹤已經處理的節點數據並忽略它)。你可以用真正的編程語言來完成,但這是我的經驗之外。

0

您可以編寫一個簡單的C#應用​​程序,使用Linq將所有節點作爲獨立實體進行兩次讀取,然後查找所有相同的值。

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>'] 
+0

這很酷,我很欣賞額外的努力! 看起來這隻適用於根級節點,但是,不是嗎? – duma 2009-03-12 15:12:06