Есть файл xml который имеет вид :
Нужно заменить добавить до всех слов Xml, слово New
Делаю так:
string prefix = "New";
string word = "Xml";
string regexPattern = $@"(?foreach (var node in xdoc.Descendants())
{
node.Value = Regex.Replace(node.Value, regexPattern, replacement);
foreach (var attribute in node.Attributes())
{
attribute.Value = Regex.Replace(attribute.Value, regexPattern, replacement);
}
}
return xdoc;
Замена происходит, но, почему то удаляются ноды
Что я делаю не так? В чем моя ошибка?
Ответ
xdoc.Descendants() возвращает первым элементом корень всего документа, т.е. тег test со всем его содержимым.
Свойство XElement.Value
Возвращает или задает сцепленное текстовое содержимое этого элемента.
Поэтому вы первой же итерацией просто уничтожаете все вложенные теги. Всё, дальше итераций не будет.
Починить можно так:
foreach (var node in xdoc.Root.Descendants())
или так:
foreach (var node in xdoc.Descendants("line1"))
Цикл по атрибутам надо будет вынести отдельно.
Еще один вариант (без правки заголовка цикла) — пропускать элементы, имеющие дочерние элементы:
if (!node.HasElements)
node.Value = Regex.Replace(node.Value, regexPattern, replacement);
Тогда цикл по атрибутам можно оставить внутри.
(правильность самой регулярки не проверял)
Комментариев нет:
Отправить комментарий