Linq to XML - удалить узел и добавить новый узел в том же месте - PullRequest
5 голосов
/ 29 октября 2009

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

Ответы [ 3 ]

8 голосов
/ 04 ноября 2009

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

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> Меркурий, добавляет к нему дополнительный элемент, удаляет его и повторно вставляет в конец коллекции <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>
4 голосов
/ 04 ноября 2009

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

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

1 голос
/ 13 декабря 2012

Это просто основано на примере @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, как я.

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