3

だから私はいくつかの XML を解析しようとしていますが、その作成は私の制御下にありません。問題は、彼らがどういうわけか次のようなノードを持っていることです:

<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(MORNINGSTAR) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(QUARTERSTAFF) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(SCYTHE) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(TRATNYR) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(TRIPLE-HEADED_FLAIL) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(WARAXE) />

Visual Studio と .NET は両方とも、上記で使用されている '(' と ')' 文字は完全に無効であると感じています。残念ながら、これらのファイルを処理する必要があります。Xml Reader クラスがこれらの文字を見て慌てたり、動的にエスケープしたりしないようにする方法はありますか? ファイル全体に対してある種の前処理を行うこともできますが、「(」と「)」の文字が有効な方法でノード内に表示される場合はそれらが必要なので、それらをすべて削除したくありません。 ..

4

2 に答える 2

8

それは単に有効ではありません。おそらく正規表現を使用した前処理が最善の策です-次のようなものです:

string output = Regex.Replace(input, @"(<\w+)\((\w+)\)([ >/])", "$1$2$3");

編集:括弧内の「 - 」を置き換えるのはもう少し複雑です:

string output = Regex.Replace(input, @"(<\w+)\(([-\w]+)\)([ >/])",
    delegate(Match match) {
        return match.Groups[1].Value + match.Groups[2].Value.Replace('-', '_')
             + match.Groups[3].Value;
    });
于 2009-07-01T13:25:19.650 に答える
3

構文的に有効でない場合、それは XML ではありません。

XML はこれについて非常に厳密です。

送信側のアプリケーションに正しい XML を送信させることができない場合は、それがあなたのものであろうと将来の他のアプリであろうと、ダウンストリーム プロセスがこれを確認すると失敗することを彼らに知らせてください。

前処理がオプションでない場合Stream、パーサーに渡されるオブジェクトをカスタム ストリームでラップする別の巧妙なメカニズムがあります。そのストリームは文字を探し、<文字が見つかったらフラグを設定できます。文字が表示されるまで、任意の文字>を食べることができます。従来の転送メカニズムによって XML ファイルに追加された NUL および ^Z 文字を取り除くために、このようなものを使用しました。(唯一の落とし穴は、属性内に文字が存在する可能性があることです。エスケープする必要がないためです。文字だけがエスケープされます。)()<>

于 2009-07-01T13:28:21.250 に答える