复制XML块并将其粘贴到同一文档中

时间:2013-11-26 18:48:48

标签: c# xml

我试图想出一种方法来复制XML块,然后将其粘贴到另一个块下面。例如,我想复制Cars中的所有内容并将其粘贴到Truck节点下面。

来源:

<Vehicles>
  <Cars>
    <Car name="Mustang">
      <engine>V8</engine>
    </Car>
    <Car name="Taurus">
      <engine>V6</engine>
    </Car>
  </Cars>
  <Truck name="F-150" />
  <Truck name="Ranger" />
</Vehicles>

期望的结果:

<Vehicles>
  <Truck name="F-150" />
  <Truck name="Ranger" />
  <Cars>
    <Car name="Mustang">
      <engine>V8</engine>
    </Car>
    <Car name="Taurus">
      <engine>V6</engine>
    </Car>
  </Cars>
</Vehicles>

我已尝试过AddAfterSelf和CloneNode等方法,但它们同时进行复制和粘贴。我需要它来复制Cars块,然后在运行其他代码之后,将它粘贴到最后一个Truck节点之后。我也尝试使用剪贴板,但无法弄清楚如何复制XML块并粘贴它。

2 个答案:

答案 0 :(得分:0)

只需保存对要复制的根节点的引用,然后根据需要随时调用CloneNode。

编辑:这让我觉得很脏:

doc
    .Element("Vehicles")
    .ReplaceAll
    (
        doc
            .Element("Vehicles")
            .Elements("Truck")
            .OrderBy(i => i.Attribute("name").Value)
            .Union
            (
                new []
                {
                    new XElement
                    (
                        "Cars", 
                        doc
                            .Element("Vehicles")
                            .Element("Cars")
                            .Elements()
                            .OrderBy(i => i.Attribute("name").Value).ToArray()
                    )
                }
            )   
    );

但它确实起到了作用。

答案 1 :(得分:0)

//Load XML file to sort cars.
XElement file = XElement.Load(@"..\Test.xml");

//Sort cars by "name" and save the file.
file.Element("Cars").ReplaceNodes(file.Element("Cars").Elements("Car")
    .OrderBy(n => (string)n.Attribute("name")));
file.Save(@"..\Test.xml");

//Load XML file to sort Trucks.
XDocument doc = XDocument.Load(@"..\Test.xml");

//Sort trucks by "name" and save file.
doc.Element("Vehicles").ReplaceAll(doc.Element("Vehicles").Elements()
    .OrderBy(t => t.Name == "Truck").ThenBy(m => (string)m.Attribute("name")));
doc.Save(@"..\Test.xml");

//Open sorted XML file to verify sort.
Process.Start(@"..\Test.xml");