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

そのようなことは聞いたことがありませんが、アーカイバーで使用される辞書コーダーに基づいてそのようなプログラムを作成するのは興味深い作業になるかもしれません。

于 2008-10-29T21:18:43.863 に答える
0

非常によく似た質問(この質問の 1 年後) には、 Atomiqなど、同じファイル内のチャンクを比較するための非常に優れたツールを使用した回答がいくつかあります。

于 2016-07-21T19:38:41.410 に答える
0

簡単ではありません。私の最初の考えは XSLT ですが、実装するのは難しいです。各ノードを通過してから、同じデータを持つすべてのノードで XPATH 選択を行う必要があります。それはそれらを見つけますが、後で同じデータを持つすべてのノードを処理することになります (つまり、既に処理したノード データを追跡して無視する方法はありません)。実際のプログラミング言語でそれを行うこともできますが、それは私の経験外です。

于 2009-01-23T15:50:55.627 に答える
0

Linq を使用してすべてのノードを個別のエンティティとして 2 回読み取り、等しいすべての値を見つける単純な C# アプリを作成できます。

于 2009-01-23T15:53:22.780 に答える