クイック& “ ID”を更新する汚い方法XML(C#)としてフォーマットされた文字列
質問
ワンショット操作の場合、XML文字列の内容を解析し、「ID」の番号を変更する必要があります。フィールド。しかし、私は文字列の他の何かを変更するリスクはありません。空白、改行などはそのままにしておく必要があります!
私はXmlReaderが空白を混乱させる傾向があり、XMLを再フォーマットすることさえあるという経験をしたので、それを使いたくありません(ただし、そうでなければ私に納得させてください)。これはRegExにとっても悲鳴ですが、...私はRegExが得意ではありません。特に.NET実装ではそうではありません。
これは文字列の短い部分です。IDフィールドの番号を更新する必要がある場合があります。文字列には、このようなVARエントリが多数存在する場合があります。したがって、各IDをInt32に変換し、&を比較する必要があります。変更してから、文字列に戻します。
<VAR NAME="sf_name" ID="1001210">
これを行うための最も簡単な(コーディング時間の観点から)最も安全な方法を探しています。
解決
探している正規表現パターンは次のとおりです:
ID="(\d+)"
一致グループ1には番号が含まれます。 MatchEvaluator Delegate を使用して一致を置き換えます動的に計算された置換。
Regex r = new Regex("ID=\"(\\d+)\"");
string outputXml = r.Replace(inputXml, new MatchEvaluator(ReplaceFunction));
where ReplaceFunction
は次のようなものです:
public string ReplaceFunction(Match m)
{
// do stuff with m.Groups(1);
return result.ToString();
}
必要に応じて、より具体的に一致するように正規表現を展開できます。現在、すべてのID値(数字のみを含む)は置き換えられます。 「余分なインテリジェンス」のビットを構築することもできます。一致エバリュエーター関数に追加し、変更したくない場合は変更せずに一致を返すようにします。
他のヒント
このプロパティをご覧ください PreserveWhitespace XmlDocument クラス