【问题标题】:Copy Block of XML and Paste it in Same Document [duplicate]复制 XML 块并将其粘贴到同一文档中 [重复]
【发布时间】:2013-11-28 01:08:46
【问题描述】:

我正在尝试找出一种方法来复制一个 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 块并粘贴它。

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    只需保留对要复制的根节点的引用,然后根据需要随时调用 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()
                        )
                    }
                )   
        );
    

    但它确实有效。

    【讨论】:

    • 也许我需要多解释一下我的情况。我正在使用 ReplaceNodes 按属性(“名称”)对卡车节点进行排序。当我这样做时,它会删除 Cars 以及其中的所有内容,因为该文档的结构是这样的。我需要能够复制 Cars,运行代码以按名称对 Truck 进行排序,然后粘贴 Cars。
    • 好的,我想我现在明白了。但是,我不得不问 - 如果您已经在内存中拥有整个 XML 文档,那么创建一个全新的文档并按照您想要的顺序输出数据真的很糟糕吗?如果是,那么即使仅使用 XmlDocument,您也可能会遇到问题。
    • 我试图阻止创建新文档,因为我有另一个程序正在按文件名读取这些 XML 文件(我正在为其构建许多文件)。也许只是我的代码对 XML 进行排序存在问题。
    • 这是我对 XML 进行排序的代码: XElement file = XElement.Load(@"..\Test.xml"); XDocument doc = XDocument.Load(@"..\Test.xml"); file.Element("Cars").ReplaceNodes(file.Element("Cars").Elements("Car").OrderBy(m => (string)m.Attribute("name"))); file.Save(@"..\Test.xml"); doc.Element("Vehicles").ReplaceNodes(doc.Element("Vehicles").Elements("Truck").OrderBy(n => (string)n.Attribute("name"))); doc.Save(@"..\Test.xml");第 5 行删除了 Cars 和其中的所有内容。
    • 好吧,如果文件不是太大,您可以使用 LINQ to SQL。将整个文件加载到 XDocument 中,然后执行doc.Element("Vehicles").ReplaceAll(doc.Element("Vehicles").Elements().OrderBy(i =&gt; i.Name == "Truck" ? 1 : 2))。如果您不明白它的作用,请随时提出问题。
    【解决方案2】:
    //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");
    

    【讨论】:

      猜你喜欢
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2011-01-03
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多