linq to xml — удалить узел-оболочку

#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() который я никогда не использовал. Посмотрите, то ли это, что вам нужно.