ノード名に無効な文字でXMLを解析する方法は?
-
21-08-2019 - |
質問
、の作成は私の管理下にはありません。トラブルは、彼らが何らかの形でこのように見えるのノードを持って、次のとおりです。
<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リーダークラスを取得する方法はありますか?私は、ファイル全体に前処理のいくつかの並べ替えを行うことができますが、彼らはいくつかの有効な方法でノード内に表示された場合、私は、「(」と「)」文字をしたいですので、私はちょうどそれらをすべて削除する必要はありません。 ..
解決
これは単に有効ではありません。前処理は、おそらく正規表現で、あなたの最高の賭けである - のようなもの:
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;
});
他のヒント
、それはXMLではありません。
XMLはこのことについて非常に厳しいです。
あなたは正しいXMLを送信するための送信アプリケーションを得ることができない場合は、ちょうどそれらが下流のプロセスは、これはのそれはあなたまたは一部のかどうか、を失敗します見ているのどんなのことを知ってみましょう将来的には他のアプリます。
前処理ができない場合は、別の巧妙なメカニズムは、カスタムストリームとパーサに渡されStream
オブジェクトをラップすることです。そのストリームは<
文字を探して、それが1を見たときに、フラグを設定することができます。 >
文字が表示さになるまで、それはどの(
または)
文字を食べることができます。私たちは、従来の搬送機構により、XMLファイルに追加NULと^ Zの文字を取り除くために、このようなものを使用しました。 (彼らはそこにエスケープする必要はありませんので、のみ、属性の内部<
文字があるかもしれない落とし穴 - 。唯一>
文字が行う)