如何使用c#将一个特定标记合并成一个XML?

如何使用c#将一个特定标记合并成一个XML?,c#,xml,C#,Xml,我有两个XML XML1: '<?xml version="1.0" encoding="utf-8"?> <Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Filename>1234</

我有两个XML

XML1:

'<?xml version="1.0" encoding="utf-8"?>
    <Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
         <Filename>1234</Filename>
             <Sequence Type="FRONT">
                <Object>
                    <Value>3421</Value>
                    <Value>John</Value>
                </Object>
             </Sequence>
      </Data>'
 '<?xml version="1.0" encoding="utf-8"?>
    <Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
         <Filename>1234</Filename>
             <Sequence Type="FRONT">
                <Object>
                    <Value>1234</Value>
                    <Value>SAM</Value>
                </Object>
             </Sequence>
      </Data>'
'
1234
3421
约翰
'
XML2:

'<?xml version="1.0" encoding="utf-8"?>
    <Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
         <Filename>1234</Filename>
             <Sequence Type="FRONT">
                <Object>
                    <Value>3421</Value>
                    <Value>John</Value>
                </Object>
             </Sequence>
      </Data>'
 '<?xml version="1.0" encoding="utf-8"?>
    <Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
         <Filename>1234</Filename>
             <Sequence Type="FRONT">
                <Object>
                    <Value>1234</Value>
                    <Value>SAM</Value>
                </Object>
             </Sequence>
      </Data>'
'
1234
1234
山姆
'
我希望输出如下所示

 '<?xml version="1.0" encoding="utf-8"?>
    <Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
         <Filename>1234</Filename>
             <Sequence Type="FRONT">
                <Object>
                    <Value>3421</Value>
                    <Value>John</Value>
                </Object>
                <Object>
                    <Value>1234</Value>
                    <Value>SAM</Value>
                </Object>
             </Sequence>
      </Data>'
'
1234
3421
约翰
1234
山姆
'
也就是说,我想使用C#代码将对象标记从XML2合并到XML1


有人能帮我吗?

请看一下这个解决方案:


使用Union方法似乎是您所寻求的。

您可以使用XPath选择所需的节点,然后使用System.xml使用.NET xml

有关更多信息,请参阅

加载Xml文档 我将您提供的两个示例xml文件保存到单独的文件中,并像这样导入它们 XmlDocument doc1=新的XmlDocument(); XmlDocument doc2=新的XmlDocument()

使用XPATH选择节点 我们将获取所有名为“object”的元素,并将它们添加到另一个xml的“sequence”元素的子元素中。因此,我们选择一个文档的“序列”元素和另一个文档的“对象”元素

    var sequenceNodes = doc1.SelectSingleNode("/Data/Sequence");
    var objectNodes = doc2.SelectNodes("/Data/Sequence/Object");
将节点合并到一个文档中 然后,我们获取每个“object”元素,将其导入到另一个文档上下文中,并将其附加到“sequence”节点下

    foreach (XmlNode node in objectNodes)
    {
        XmlNode importedNode = doc1.ImportNode(node, true);
        sequenceNodes.AppendChild(importedNode);
    }
输出文件 输出文件如下所示:
运行XSLT转换:

<xsl:template name="merge">
   <Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xmlns:xsd="http://www.w3.org/2001/XMLSchema">
         <Filename>1234</Filename>
         <Sequence Type="FRONT">
                <xsl:copy-of select="document('a.xml')//Object"/>
                <xsl:copy-of select="document('b.xml')//Object"/>
         </Sequence>
   </Data>
</xsl:template>  

1234

尝试使用linq将所有文件名与相同的值连接起来

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication166
{
    class Program
    {
        const string FILENAME1 = @"c:\temp\test.xml";
        const string FILENAME2 = @"c:\temp\test1.xml";
        static void Main(string[] args)
        {
            XDocument doc1 = XDocument.Load(FILENAME1);
            XNamespace ns1 = doc1.Root.GetDefaultNamespace();
            XDocument doc2 = XDocument.Load(FILENAME2);
            XNamespace ns2 = doc2.Root.GetDefaultNamespace();

            var joins= from d1 in doc1.Descendants(ns1 + "Data")
                       join d2 in doc2.Descendants(ns2 + "Data")
                       on (string)d1.Element(ns1 + "Filename") equals (string)d2.Element(ns2 + "Filename")
                       select new { d1 = d1, d2 = d2};

            foreach (var join in joins)
            {
                XElement d2Object = join.d2.Descendants("Object").FirstOrDefault(); 
                join.d1.Descendants("Sequence").FirstOrDefault().Add(XElement.Parse(d2Object.ToString()));
            }


        }
    }
 
}
没问题;)如果它对您有帮助,您可以接受它作为一个答案;)