【问题标题】:Merge two XML Documents in C#在 C# 中合并两个 XML 文档
【发布时间】:2020-12-08 06:41:47
【问题描述】:

我正在尝试合并两个 xml 文档并且不想保留重复项。让我在这里提一下,我将这两个 xml 文档放在一个字符串变量中。我正在尝试以下方式,但出现错误。我尝试使用 XmlDocument 和 XDocument 但没有成功。获取非法字符。

我也尝试过这些解决方案,但失败了。

  1. combine two xml_docs C# xmlDocument
  2. How to merge two XmlDocuments in C#
  3. Smart merging of two XML files
  4. How can I merge XML files?
  5. How to merge two XmlDocuments in C#
  6. What is the fastest way to combine two xml files into one

请帮帮我。

public class Sample
{
    public static void Main()
    {
        var xDoc1 = string.Concat("<?xml version='1.0' encoding='utf - 8'?>", 
            "<Tp>" +
            "<Txn-Profile>" +
            "<TXN_CODE>CHD</TXN_CODE>" +
            "<NO_OF_TXN>5</NO_OF_TXN>" +
            "<MAX_TXN_AMOUNT>70500</MAX_TXN_AMOUNT" +
            "><TOTAL_AMOUNT>80500</TOTAL_AMOUNT>" +
            "<TXN_DESCUI>Cash Deposit1</TXN_DESCUI>" +
            "</Txn-Profile>" +
            "</Tp>");

        var doc1 = XDocument.Load(xDoc1);


        var xDoc2 = string.Concat("<?xml version='1.0' encoding='utf - 8'?",
            "<Tp>" +
            "<Txn-Profile>" +
            "<TXN_CODE>CHD</TXN_CODE>" +
            "<NO_OF_TXN>5</NO_OF_TXN>" +
            "<MAX_TXN_AMOUNT>90000</MAX_TXN_AMOUNT>" +
            "<TOTAL_AMOUNT>210000</TOTAL_AMOUNT>" +
            "<TXN_DESCUI>Cash Deposit1</TXN_DESCUI>" +
            "</Txn-Profile>" +
            "<Txn-Profile>" +
            "<TXN_CODE>DCL</TXN_CODE>" +
            "<NO_OF_TXN>5</NO_OF_TXN>" +
            "<MAX_TXN_AMOUNT>50000</MAX_TXN_AMOUNT>" +
            "<TOTAL_AMOUNT>200000</TOTAL_AMOUNT>" +
            "<TXN_DESCUI>Deposit By Instruments (Clearing)</TXN_DESCUI>" +
            "</Txn-Profile>" +
            "</Tp>");
        var doc2 = XDocument.Load(xDoc2);

        var mergeXmlDocs = doc1.Descendants("Tp").Union(doc2.Descendants("Tp"));

        Console.WriteLine(mergeXmlDocs.ToString());

        Console.ReadLine();
    }
}

【问题讨论】:

  • 重复是什么意思?是否所有值都需要相同或只有 TXN_CODE。如果 TXN_CODE 相同,那你要保留哪一个?
  • @jdweng,我整天都在等你:)。如您所见,TXN_CODE-->CHD,两个 xml 具有相同的代码,但第二个已更新。我可能会得到 n 个这样的 xml 文档,并且需要与更新的 xml 文档合并。希望你能理解。
  • 欢迎来到 Stack Overflow。不幸的是,说“但出现错误”、“但没有成功”和“但失败”并不能告诉我们任何事情出了什么问题。这相当于去看医生并说“我病了”,并期待在没有检查的情况下得到诊断。请阅读codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question 并编辑您的问题以提供更多更多信息。
  • 那么更新 doc2 以包含 doc1 中缺失的项目是正确的方法吗?
  • @jdweng,是的,这就是我想要的。

标签: c# xml


【解决方案1】:

尝试以下:

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


namespace ConsoleApplication176
{
    class Program
    {

        static void Main(string[] args)
        {
            string xDoc1 = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
                "<Tp>" +
                "<Txn-Profile>" +
                "<TXN_CODE>CHD</TXN_CODE>" +
                "<NO_OF_TXN>5</NO_OF_TXN>" +
                "<MAX_TXN_AMOUNT>70500</MAX_TXN_AMOUNT" +
                "><TOTAL_AMOUNT>80500</TOTAL_AMOUNT>" +
                "<TXN_DESCUI>Cash Deposit1</TXN_DESCUI>" +
                "</Txn-Profile>" +
                "</Tp>";

            var doc1 = XDocument.Parse (xDoc1);


            string xDoc2 = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
                "<Tp>" +
                "<Txn-Profile>" +
                "<TXN_CODE>DCL</TXN_CODE>" +
                "<NO_OF_TXN>5</NO_OF_TXN>" +
                "<MAX_TXN_AMOUNT>50000</MAX_TXN_AMOUNT>" +
                "<TOTAL_AMOUNT>200000</TOTAL_AMOUNT>" +
                "<TXN_DESCUI>Deposit By Instruments (Clearing)</TXN_DESCUI>" +
                "</Txn-Profile>" +
                "</Tp>";
            XDocument doc2 = XDocument.Parse(xDoc2);
            List<string> txnCodes2 = doc2.Descendants("TXN_CODE").Select(x => (string)x).ToList();


            XElement txn2 = doc2.Descendants("Txn-Profile").FirstOrDefault();

            foreach (XElement txnProfilet in doc1.Descendants("Txn-Profile"))
            {
                string txnCode1 = (string)txnProfilet.Descendants("TXN_CODE").FirstOrDefault();
                if (!txnCodes2.Contains(txnCode1))
                {
                    txn2.Add(txnProfilet);
                }
            }

        }
    }

}

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多