XMLファイルがあり、CDATAが重複しているノードを見つけたい。これを行うのに役立つツールはありますか?
これを一般的にテキストドキュメントに対して行うツールで問題ありません。
XMLファイルがあり、CDATAが重複しているノードを見つけたい。これを行うのに役立つツールはありますか?
これを一般的にテキストドキュメントに対して行うツールで問題ありません。
これは、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>']
そのようなことは聞いたことがありませんが、アーカイバーで使用される辞書コーダーに基づいてそのようなプログラムを作成するのは興味深い作業になるかもしれません。
簡単ではありません。私の最初の考えは XSLT ですが、実装するのは難しいです。各ノードを通過してから、同じデータを持つすべてのノードで XPATH 選択を行う必要があります。それはそれらを見つけますが、後で同じデータを持つすべてのノードを処理することになります (つまり、既に処理したノード データを追跡して無視する方法はありません)。実際のプログラミング言語でそれを行うこともできますが、それは私の経験外です。
Linq を使用してすべてのノードを個別のエンティティとして 2 回読み取り、等しいすべての値を見つける単純な C# アプリを作成できます。