Быстрый и грязный способ обновить «идентификаторы» в строке в формате XML (C #) - PullRequest
2 голосов
/ 03 ноября 2008

Для однократной операции мне нужно проанализировать содержимое строки XML и изменить номера поля «ID». Тем не менее, я не могу рискнуть изменить что-нибудь еще из строки, например. пробелы, переводы строк и т. д. ДОЛЖНЫ оставаться такими, какие они есть!

Поскольку я понял, что XmlReader имеет тенденцию запутывать пробелы и может даже переформатировать ваш XML, я не хочу его использовать (но не стесняйтесь убеждать меня в обратном). Это также кричит о RegEx, но ... я не очень хорош в RegEx, особенно в реализации .NET.

Вот короткая часть строки, в некоторых случаях необходимо обновить номер поля идентификатора. В строке может быть много таких записей VAR. Поэтому мне нужно преобразовать каждый идентификатор в Int32, сравнить и изменить его, а затем вернуть обратно в строку.

<VAR NAME="sf_name" ID="1001210">

Я ищу самый простой (с точки зрения времени кодирования) и самый безопасный способ сделать это.

Ответы [ 2 ]

4 голосов
/ 03 ноября 2008

Шаблон регулярного выражения, который вы ищете:

ID="(\d+)"

Группа совпадений 1 будет содержать номер. Используйте MatchEvaluator Delegate для замены совпадений динамически рассчитанными заменами.

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();
}

Если вам нужно, я могу расширить регулярное выражение, чтобы соответствовать более конкретно. В настоящее время все значения ID (которые содержат только цифры) заменяются. Вы также можете встроить этот бит «дополнительного интеллекта» в функцию оценки совпадений и заставить ее возвращать совпадение без изменений, если вы не хотите его менять.

0 голосов
/ 03 ноября 2008

Посмотрите на это свойство PreserveWhitespace в XmlDocument class

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...