如何将XML块从一个文档复制到另一个文档?

时间:2012-09-28 13:43:15

标签: c# xml

我有两个dataGridViews,每个都加载一个XML文件,我已经做到这一点,你可以在每个网格之间拖放行。但是目前,它所做的只是从dataGridView复制数据。这工作正常,但我需要复制与该行相关的所有XML。

以下是我必须使用的XML:

<WindowBuilderProject>
  <stringtable>

    <stentry>0..607</stentry> //All of the other records

    <stentry>
      <index>608</index>
      <sid>MNUB_AUTO</sid>
      <val>
        <en>AUTO</en>
      </val>
      <params>
        <fontref>0</fontref>
        <numref>0</numref>
        <clip>FALSE</clip>
        <include>TRUE</include>
        <protected>FALSE</protected>
        <cwidth>-1</cwidth>
        <dwidth>0</dwidth>
      </params>
    </stentry>

  </stringtable>
</WindowBuilderProject>

因此,我需要复制用户选择的行的XML,并将其插入到另一个(相同格式)XML文档中。

到目前为止,我有这个:

string location = "/WindowBuilderProject/stringtable/stentry[index='" + rowIndexOfItemUnderMouseToDrop + "']";
XmlNode Copy = xDoc.ImportNode(xDoc2.SelectSingleNode(location), false);
xDoc.DocumentElement.AppendChild(Copy); //This is just supposed to add it to the end, I will worry about ordering once it works

它运行正常,但所有发生的事情我都被添加到XML文件的底部。如何选择整个XML块?

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:4)

假设您要将text1.xml中的元素块复制到text2.xml,可以使用LINQ to XML,下面的示例假设将所有条目从text1复制到文本2:

  var xDoc1 = XDocument.Load("C:\\text1.xml");
  var xDoc2 = XDocument.Load("C:\\text2.xml");

  var doc1Entries = xDoc1.Descendants("stentry");

  var cloneEntries = doc1Entries.Select(x => new XElement(x));
  xDoc2.Descendants("stentry").Last().AddAfterSelf(cloneEntries);

  xDoc2.Save("C:\\text2.xml");

但您也可以使用Where方法过滤以获取xml的一部分,下面的示例是使用索引列表进行过滤:

  var filterIndices = new[] {600, 601, 700, 705};

  var doc1Entries =
      xDoc1.Descendants("stentry")
           .Where(x =>         
               filterIndices.Contains(int.Parse(x.Element("index").Value)));

在这里,我假设使用Last插入到最后一个,但是如果你关心排序,你可以在xDoc2上使用LINQ来找到正确的位置,然后插入。

答案 1 :(得分:2)

每个XmlNode都有几个方法(而XmlDocument是XmlNode的子类),所以你可以使用 xDoc.SelectNodes() xDoc.SelectSingleNode()来选择在文档结构中的任何位置,将该节点存储在对象中(让我们称之为needleNode),然后执行 xDoc.InsertBefore(Copy,ref needleNode) xDoc.InsertAfter(复制) ,ref needleNode)。使用这四个函数,您可以将xml部分插入第二个xml结构中的绝对任何部分。

答案 2 :(得分:0)

如果你的控件是数据绑定的,你不需要在DataGridView的行集合中添加/删除行(实际上你不能这样做)。而是将它们添加到基础数据源集合(您正在设置DataGridView的DataSource属性的集合)。之后,您需要刷新两个datagridviews的视图以反映更改。