Быстрый & amp; Грязный способ обновить & # 8220; идентификаторы & # 8221; в строке, отформатированной как XML (C #)
Вопрос
Для однократной операции мне нужно проанализировать содержимое строки XML и изменить номера идентификатора " ID " поле. Тем не менее, я не могу рискнуть изменить что-нибудь еще из строки, например. пробелы, переводы строк и т. д. ДОЛЖНЫ оставаться такими, какие они есть! Р>
Поскольку я понял, что XmlReader имеет тенденцию запутывать пустые места и может даже переформатировать ваш XML, я не хочу его использовать (но не стесняйтесь убеждать меня в обратном). Это также кричит о RegEx, но ... я не очень хорош в RegEx, особенно в реализации .NET.
Вот короткая часть строки, в некоторых случаях необходимо обновить номер поля идентификатора. В строке может быть много таких записей VAR. Поэтому мне нужно преобразовать каждый идентификатор в Int32, сравнить и измените его и вставьте обратно в строку.
<VAR NAME="sf_name" ID="1001210">
Я ищу самый простой (с точки зрения времени кодирования) и самый безопасный способ сделать это.
Решение
Шаблон регулярного выражения, который вы ищете:
ID="(\d+)"
Группа совпадений 1 будет содержать номер. Используйте Делегат MatchEvaluator , чтобы заменить совпадения на динамически рассчитанные замены.
Regex r = new Regex("ID=\"(\\d+)\"");
string outputXml = r.Replace(inputXml, new MatchEvaluator(ReplaceFunction));
где ReplaceFunction
выглядит примерно так:
public string ReplaceFunction(Match m)
{
// do stuff with m.Groups(1);
return result.ToString();
}
Если вам нужно, я могу расширить Regex, чтобы соответствовать более конкретно. В настоящее время все значения ID (которые содержат только цифры) заменяются. Вы также можете создать этот бит "дополнительного интеллекта" в функцию оценки совпадений и заставить ее возвращать совпадение без изменений, если вы не хотите его менять.
Другие советы
Ознакомьтесь с этим свойством PreserveWhitespace в класс XmlDocument