簡體   English   中英

如何使用 c# 將一個特定標簽合並到一個 XML 中?

[英]How to merge one specific tag into one XML using c#?

我有兩個 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>'

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>1234</Value>
                    <Value>SAM</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>3421</Value>
                    <Value>John</Value>
                </Object>
                <Object>
                    <Value>1234</Value>
                    <Value>SAM</Value>
                </Object>
             </Sequence>
      </Data>'

即我想使用 C# 代碼將對象標記從 XML2 合並到 XML1。

有人可以幫我嗎?

您可以使用 XPath 來選擇您需要的節點,然后using System.Xml簡單地使用 .NET xml

有關更多信息,查看https://www.w3schools.com/xml/xpath_intro.asp

加載 Xml 文檔

我保存了您提供的兩個示例 xml 文件以分隔文件並像這樣導入它們 XmlDocument doc1 = new XmlDocument(); XmlDocument doc2 = new XmlDocument();

    using (var sw = new StreamReader("xml1.xml"))
    {
        var text = sw.ReadToEnd();
        doc1.LoadXml(text);
    }

    using (var sw = new StreamReader("xml2.xml"))
    {
        var text = sw.ReadToEnd();
        doc2.LoadXml(text);
    }

使用 XPATH 選擇節點

我們將獲取所有名為“object”的元素,並將它們添加到另一個 xml 的“sequence”元素的子元素中。 因此,我們選擇一個文檔的“序列”元素和另一文檔的“對象”元素。

    var sequenceNodes = doc1.SelectSingleNode("/Data/Sequence");
    var objectNodes = doc2.SelectNodes("/Data/Sequence/Object");

將節點連接到一個文檔中

然后我們獲取每個“對象”元素,將其導入另一個文檔上下文並將其附加到“序列”節點下

    foreach (XmlNode node in objectNodes)
    {
        XmlNode importedNode = doc1.ImportNode(node, true);
        sequenceNodes.AppendChild(importedNode);
    }

輸出文件

    using (var stringWriter = new StringWriter())
    using (var xmlTextWriter = XmlWriter.Create(stringWriter))
    {
        doc1.WriteTo(xmlTextWriter);
        xmlTextWriter.Flush();
        File.AppendAllText("out.xml", stringWriter.GetStringBuilder().ToString());
    }

輸出文件如下所示: 在此處輸入圖片說明

請看一下這個解決方案: what-is-the-fastest-way-to-combine-two-xml-files-into-one

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

運行 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>  

嘗試按照 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()));
            }


        }
    }
 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM