2009-07-01 13 views
3

私はいくつかのXMLを解析しようとしていますが、その作成は私のコントロール下にありません。ノード名に無効な文字を含む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リーダークラスを取得する方法はありますか?私はファイル全体に対して何らかの事前処理を行うことができますが、ノード内に適切な方法で表示されている場合は '('と ')文字が必要なので、それらをすべて削除する必要はありません。 ..

+0

If is invalidはXMLではありません。期間。それをテキストとして処理します。 –

+2

このファイルは、xmlパーサに送信される前に他のツールで前処理されているように見えます。 ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(MORNINGSTAR)は実際にそこに存在するはずのもののルックアップのように見えます。 – Dolphin

答えて

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; 
    }); 
+0

私は最も制限の厳しい正規表現を試すでしょう – Dolphin

+0

@ Dolphin - 具体的な提案を提供するケア? –

+0

正規表現はほとんど機能しますが、何らかの形で上記の例の最後から2番目のノードはそのまま '('と ')'でそのまま残ります:\ – GWLlosa

3

はそれがにISNが」構文的には有効ですが、XMLではありません。

XMLはこれに関して非常に厳しいです。あなたは正しいXMLを送信するために送信するアプリケーションを取得できない場合

、その後、ちょうどそれらがどんな下流プロセスは、それはあなたのものや、将来的に他のいくつかのアプリのかどうか、を失敗します。このを見ていることを知ってみましょう。

前処理がオプションでない場合は、パーサーに渡されたStreamオブジェクトをカスタムストリームでラップすることも巧妙な方法です。そのストリームは<の文字を探し、それが見えるときはフラグを設定します。 >文字が表示されるまでは、(または)文字を食べることができます。従来のトランスポートメカニズムでXMLファイルにNULと^ Z文字を追加するために、これを使用しました。 (<の文字が属性内にある可能性があります。その文字はエスケープする必要がないため、>文字のみです)。

関連する問題