2009-10-29 5 views
5

У меня есть XDocument и вам нужно удалить узел и снова добавить тот же узел после некоторых манипуляций (мой узел xelement является сложным и имеет внутренние узлы как Что ж). Кто-нибудь получил хороший способ сделать это, так как мой новый управляемый узел добавляется в самом конце xmldocument. Любые фрагменты кода будут с благодарностью оценены.Linq to XML - удалить узел и добавить новый узел в том же месте

ответ

4

Если вы только редактирование узла, то почему бы удалить его вообще? Просто получите ссылку на него в дереве и отредактируйте его на месте.

Если это не вариант по каким-то причинам, то один из способов это сделать это: как только вы нашли XElement (или, в общем, XNode), необходимо заменить в дереве, создать новый XElement для использования в качестве замены, а затем использовать метод XNode.ReplaceWith для старого элемента, передавая новый в качестве аргумента.

8

Если я правильно понимаю вас, это должно помочь вам это сделать.

SolarSystem.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<SolarSystem> 
    <Planets> 
    <Planet Id="1"> 
     <Name>Mercury</Name> 
    </Planet> 
    <Planet Id="2"> 
     <Name>Venus</Name> 
    </Planet> 
    <Planet Id="3"> 
     <Name>Earth</Name> 
    </Planet> 
    </Planets> 
</SolarSystem> 

Код полностью отказывает в <Planet> Mercury, добавляет дополнительный элемент к нему, удаляет его, и вновь вставляет его в конце <Planets> коллекции.

XDocument SolarSystem = XDocument.Load(Server.MapPath("SolarSystem.xml")); 
IEnumerable<XElement> Planets = SolarSystem.Element("SolarSystem").Element("Planets").Elements("Planet"); 

// identify and change Mercury 
XElement Mercury = Planets.Where(p => p.Attribute("Id").Value == "1").FirstOrDefault(); 
Mercury.Add(new XElement("YearLengthInDays", "88")); 

// remove Mercury from current position, and add back in at the end 
Mercury.Remove(); 
Planets.Last().AddAfterSelf(Mercury); 

// save it as new file 
SolarSystem.Save(Server.MapPath("NewSolarSystem.xml")); 

, который дает:

<?xml version="1.0" encoding="UTF-8"?> 
    <SolarSystem> 
    <Planets> 
     <Planet Id="2"> 
     <Name>Venus</Name> 
     </Planet> 
     <Planet Id="3"> 
     <Name>Earth</Name> 
     </Planet> 
     <Planet Id="1"> 
     <Name>Mercury</Name> 
     <YearLengthInDays>88</YearLengthInDays> 
     </Planet> 
    </Planets> 
    </SolarSystem> 
+1

+1: Nice 101 образец, чтобы люди начали –

1

Это просто опирается на приведенный выше пример @Ralph Lavelle. Я создал полное консольное приложение, чтобы я мог играть с кодом & понять его лучше. Понял, что я поделюсь им. Он использует тот же самый образец XML сверху, но мне пришлось удалить ссылки на Server.MapPath(), поскольку я не мог понять, как заставить их работать. Вы здесь:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml.Linq; 

class LinqDemo 
{ 
static void Main() 
    { 
     XDocument SolarSystem = XDocument.Load("SolarSystem.xml"); 
     IEnumerable<XElement> Planets = SolarSystem.Element("SolarSystem").Element("Planets").Elements("Planet"); 

     // identify and change Mercury 
     XElement Mercury = Planets.Where(p => p.Attribute("Id").Value == "1").FirstOrDefault(); 
     Mercury.Add(new XElement("YearLengthInDays", "88")); 

     // remove Mercury from current position, and add back in at the end 
     Mercury.Remove(); 
     Planets.Last().AddAfterSelf(Mercury); 

     // save it as new file 
     SolarSystem.Save("NewSolarSystem.xml"); 
    } 
} 

Возможно, это поможет другой LINQ noob, как я.

+0

Оцените краткий рабочий пример. Найдено, что 'using System;' *** не требуется ***. Но что 'использование System.Xml; *** необходимо ***. – DavidRR

+0

Вы очень желанны. Я ненавижу найти вопрос, который, как представляется, имеет ответ, который я ищу, и смутный код о том, как это сделать. Хорошая ошибка при использовании ошибки. – delliottg

Смежные вопросы