Быстрый & amp; Грязный способ обновить & # 8220; идентификаторы & # 8221; в строке, отформатированной как XML (C #)

StackOverflow https://stackoverflow.com/questions/258694

Вопрос

Для однократной операции мне нужно проанализировать содержимое строки 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top