#asp.net #xml #linq #linq-to-xml
#asp.net #xml #linq #linq-to-xml
Вопрос:
есть ли способ удалить узел, который обертывает несколько других узлов, но сохраняет содержащие узлы?
Мне нужно удалить все экземпляры «AreaImageCaption», но нужно сохранить «изображение» и «подпись»
<products>
<product>
<name>100</name>
<AreaImageCaption>
<image>image1</image>
<caption>caption1</caption>
</AreaImageCaption>
<AreaImageCaption>
<image>image2</image>
<caption>caption2</caption>
</AreaImageCaption>
</product>
</products>
Спасибо
Ответ №1:
Попробуйте это
string s =
@"<products>
<product>
<name>100</name>
<AreaImageCaption>
<image>image1</image>
<caption>caption1</caption>
</AreaImageCaption>
<AreaImageCaption>
<image>image2</image>
<caption>caption2</caption>
</AreaImageCaption>
</product>
</products>";
XElement element = XElement.Parse(s);
element.Descendants("AreaImageCaption").ToList().ForEach(aic =>
{
aic.Elements().ToList().ForEach(el => aic.Parent.Add(el));
aic.Remove();
});
string result = element.ToString();
Я пытаюсь добавить все дочерние элементы из <AreaImageCaption />
и добавить его к родительскому, а затем удалить <AreaImageCaption />
элемент.
Комментарии:
1. кажется, это работает. Единственная проблема заключается в том, что исходный XML-файл имеет больше узлов после AreaImageCaption, и при таком подходе все узлы изображения и подписи будут прикреплены к концу XML-файла, и им нужно, чтобы они оставались в том же положении… есть идеи?
2. Я не уверен в том, как сохранить порядок. Возможно, это неправильно, но вы не можете просто заменить
<AreaImageCaption>
и</AreaImageCaption>
на string. Пусто?3. да, это было первое, о чем я подумал, но это не выглядит как самый элегантный подход… Я думал, что может быть какой-то другой способ
4. вы можете либо вставить в конце, как показано выше, либо в начале с
AddFirst()
. Также естьAddAfterSelf()
который я никогда не использовал. Посмотрите, то ли это, что вам нужно.