-1

C#.NET4.0でルート要素が重複している無効なXMLをプログラムでクリーンアップしようとしています。私がやりたいのは、すべての内部要素を1つのルート要素に統合し、重複するルートを削除して、次のようにすることです。

<a>
    <b></b>
</a>
<a>
    <c></c>
</a>

になります

<a>
    <b></b>
    <c></c>
</a>

ただし、複製されたルート要素は内部XMLにも表示される可能性があります。その場合、交換したくないので、

<a>
    <a></a>
    <b></b>
</a>
<a>
    <c></c>
    <a></a>
</a>

になります

<a>
    <a></a>
    <b></b>
    <c></c>
    <a></a>
</a>

また、複製されたルート要素が常にであるとは限りません<a>。任意の名前を付けることができます。

これまで、このタスクを実行するために、ある種のエレガントな正規表現を考えようとしてきましたが/<((.|\n|\r)*?)>(.|\n|\r)*<\/\1>/、これに伴う問題は、内部XMLでの貪欲な一致が多すぎて、内部XMLでの非貪欲な一致であるということです。一致が少なすぎます。

ドキュメントのルートに戻ったときに識別するために、開いているタグと閉じているタグをカウントするスタックを作成する必要がないことを望んでいました。この問題を解決するためのシンプルでエレガントな方法を探しています。

オープンソースのサードパーティライブラリは、それらの1つがこの種の状況を処理する場合、潜在的に許容できるソリューションですが、私はむしろそれらを避けたいと思います。

誰かアイデアはありますか?

4

2 に答える 2

5

実際に XML を XML として読み取る方がよい場合があります... ConformanceLevelを Fragment に設定してリーダーを作成し、すべてのフラグメントを通常の XML として読み取ることができるはずです。そして、通常の XML 処理を使用して Xml ノードを選択/コピーします。

于 2012-06-20T23:07:32.553 に答える
0

誰かがちょうど削除したという良い答えを持っていました. ルート ノードの名前を取得し、それらのノードをすべて削除します。それが何であれ、最初のノードの名前を取得するのは簡単なはずです。

これにより、ドキュメントは基本的に希望どおりのままになり、すべてをそれらのノードの 1 つにラップするだけです。終わり。

于 2012-06-20T22:56:11.570 に答える