Linq to XML - 删除节点并在同一位置添加新节点

时间:2009-10-29 16:36:51

标签: linq-to-xml

我有一个XDocument并且必须删除一个节点并在一些操作之后再次添加相同的节点(我的xelement节点很复杂并且也有内部节点)。有没有人有一个很好的方法来做这个,因为我的新操作节点被添加到xmldocument的最后。任何代码片段都将不胜感激。

3 个答案:

答案 0 :(得分: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 :(得分:4)

如果您只是编辑节点,那么为什么要删除它?只需在树中获取对它的引用并就地编辑它。

如果出于某种原因这不是一个选项,那么可以采用一种方法:一旦找​​到XElement(或者,通常为XNode),您需要更换树,创建一个新的XElement作为替换,然后在旧元素上使用XNode.ReplaceWith方法,传递新的元素作为参数。

答案 2 :(得分:1)

这只是建立在@Ralph Lavelle上面的例子之上。我创建了一个完整的控制台应用程序,所以我可以使用代码&amp;更好地理解它。想我会分享它。它使用与上面完全相同的示例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。