将两个xml文件合并为一个的最快方法是什么

par*_*oir 27 c# xml

如果我有两个xml1和xml2字符串,它们都以相同的格式表示xml.将这些组合在一起的最快方法是什么?格式并不重要,但我只是想知道如何摆脱或?

xml1:

<?xml version="1.0" encoding="utf-8"?>
<AllNodes>
   <NodeA>
      <NodeB>test1</NodeB>
      <NodeB>test2</NodeB>
   </NodeA>
</AllNodes>
Run Code Online (Sandbox Code Playgroud)

xm2:

<?xml version="1.0" encoding="utf-8"?>
<AllNodes>
   <NodeA>
      <NodeB>test6</NodeB>
      <NodeB>test7</NodeB>
   </NodeA>
   <NodeA>
      <NodeB>test99</NodeB>
      <NodeB>test23</NodeB>
   </NodeA>
</AllNodes>
Run Code Online (Sandbox Code Playgroud)

并有这样的事情:

<?xml version="1.0" encoding="utf-8"?>
    <AllNodes>
          <NodeA>
              <NodeB>test1</NodeB>
              <NodeB>test2</NodeB>
          </NodeA>
         <NodeA>
              <NodeB>test6</NodeB>
              <NodeB>test7</NodeB>
           </NodeA>
           <NodeA>
              <NodeB>test99</NodeB>
              <NodeB>test23</NodeB>
           </NodeA>
    </AllNodes>
Run Code Online (Sandbox Code Playgroud)

Jos*_*lio 44

最简单的方法是使用LINQ to XML.您可以根据需要使用UnionConcat.

var xml1 = XDocument.Load("file1.xml");
var xml2 = XDocument.Load("file2.xml");

//Combine and remove duplicates
var combinedUnique = xml1.Descendants("AllNodes")
                          .Union(xml2.Descendants("AllNodes"));

//Combine and keep duplicates
var combinedWithDups = xml1.Descendants("AllNodes")
                           .Concat(xml2.Descendants("AllNodes"));
Run Code Online (Sandbox Code Playgroud)

  • Jose Basilio的答案非常好但不完整,它将创建一个带有2个"AllNodes"元素的XElement IEnumerator.更准确的答案是(如果重复不是问题):`xml1.Descendants("NodeA").LastOrDefault().AddAfterSelf(xml2.Descendants("NodeA")); xml1.Save();` (10认同)
  • 要将字符串转换为XElement,可以使用XElement.Parse(yourstring) (2认同)
  • 您可以使用XDocument.Parse(yourstring)将您的字符串转换为XDocument (2认同)

Tom*_*lak 9

XSLT转换可以做到:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="pXml1" select="''" />
  <xsl:param name="pXml2" select="''" />
  <xsl:param name="pRoot" select="'root'" />

  <xsl:template match="/">
    <xsl:variable name="vXml1" select="document($pXml1)" />
    <xsl:variable name="vXml2" select="document($pXml2)" />

    <xsl:element name="{$pRoot}">
      <xsl:copy-of select="$vXml1/*/*" />
      <xsl:copy-of select="$vXml2/*/*" />
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

将文件名称作为参数传递,以及新根元素的名称.

适用于任何XML文档,例如空文档.