Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将XML块从一个文档复制到另一个文档?_C#_Xml - Fatal编程技术网

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

C# 如何将XML块从一个文档复制到另一个文档?,c#,xml,C#,Xml,我有两个DataGridView,每个都加载一个XML文件,这样您就可以在每个网格之间拖放行。然而目前,它所做的只是从dataGridView复制数据。这很好,但是我需要复制与该行相关的所有XML 以下是我必须使用的XML: <WindowBuilderProject> <stringtable> <stentry>0..607</stentry> //All of the other records <stentry

我有两个DataGridView,每个都加载一个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块


非常感谢你的帮助

每个XmlNode都有几个方法(XmlDocument是XmlNode的一个子类),因此您可以使用xDoc.SelectNodes()xDoc.SelectSingleNode()在文档结构中的任何位置拾取特定节点,将该节点存储在对象中(我们称之为needNode),然后执行xDoc.InsertBefore(Copy,ref needleNode)xDoc.InsertAfter(Copy,ref needleNode)使用这四个函数,您可以将xml节插入到第二个xml结构中的任何部分。

每个XmlNode都有几个方法(XmlDocument是XmlNode的子类),因此您可以使用xDoc.SelectNodes()xDoc.SelectSingleNode()要在文档结构中的任何位置拾取特定节点,请将该节点存储在对象中(我们称之为needNode),然后执行xDoc.InsertBefore(Copy,ref neederNode)xDoc.InsertAfter(Copy,ref neederNode)。使用这四个函数,您可以将xml部分插入第二个xml结构中的任何部分。

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

  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找到正确的位置,然后执行插入。

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

  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
插入到last,但是如果您关心排序,您可以使用xDoc2上的LINQ找到正确的位置,然后执行插入。

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

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

那么您想将XML片段插入另一个XML文档片段中吗?基本上:)我正在努力选择与此相关的参数。我认为这个问题与您的问题有些关联:您是否应该为ImportNode的deep参数传递
true
而不是
false
?因此您想将XML片段插入另一个XML文档片段中?基本上:)我正在努力选择相关的参数。我认为这个问题与您的问题有些关联:您是否应该为ImportNode的deep参数传递
true
而不是
false