簡體   English   中英

在標簽ID相同的C#中合並兩個XML文件

[英]Merge two XML files in C# where the tags ID is the same

我需要在 C# 中合並兩個 XML 文件,其中 AccountNumber 在這些 XML 文件中是相同的。 我在 XML 文件中有大約 400 個帳戶。

XML 1:

<?xml version="1.0" standalone="yes"?>
<Account>
  <Table1>
    <Id>12</Id>
    <AccountNumber>5050</AccountNumber>
    <External>false</External>
  </Table1>
</Account>

XML 2:

<?xml version="1.0" standalone="yes"?>
<Account>
  <Table1>
    <AccountNumber>5050</AccountNumber>
     <ProductDate>2017-12-18</ProductDate>
    <ProductNr>294</ProductNr>
  </Table1>
</Account>

Så 結果會是這樣

XML 3:

<?xml version="1.0" standalone="yes"?>
<Account>
  <Table1>
    <Id>12</Id>
    <AccountNumber>5050</AccountNumber>
    <External>false</External>
    <ProductDate>2017-12-18</ProductDate>
    <ProductNr>294</ProductNr>
  </Table1>
</Account>

你可以使用這個:

public class XmlMatcher
{
    public XDocument MatchXmlFiles(XDocument doc1, XDocument doc2)
    {
        XDocument result = new XDocument(); 
        List<XElement> doc1Elements = doc1.Root.Elements().ToList();
        List<XElement> doc2Elements = doc2.Root.Elements().ToList();


        XElement accountElement = new XElement("Account");
        result = new XDocument(accountElement);

        for (int i = 0; i < doc1Elements.Count(); i++)
        {
            XmlDocument subDoc = new XmlDocument();
            subDoc.LoadXml(doc1Elements[i].ToString());

            string tableName     = subDoc.FirstChild.Name;
            string accountNumber = doc1Elements[i].Elements().Where(x => x.Name == "AccountNumber").FirstOrDefault().Value;

            List<XElement> doc1Childs = doc1Elements[i].Elements().ToList();
            List<XElement> doc2Childs = doc2Elements.Where(x => x.ToString().IndexOf(accountNumber) > -1).FirstOrDefault().Elements().ToList();                 

            XElement tblElement   = new XElement(tableName); 
            tblElement.Add(new XElement("Id"           , GetChildValue(doc1Childs, doc2Childs, "Id")));  
            tblElement.Add(new XElement("AccountNumber", accountNumber));
            tblElement.Add(new XElement("External"     , GetChildValue(doc1Childs, doc2Childs, "External")));
            tblElement.Add(new XElement("ProductDate"  , GetChildValue(doc1Childs, doc2Childs, "ProductDate")));
            tblElement.Add(new XElement("ProductNr"    , GetChildValue(doc1Childs, doc2Childs, "ProductNr")));
            accountElement.Add(tblElement);

        }  
        return result;
    }

    public object GetChildValue(List<XElement> doc1Childs, List<XElement> doc2Childs, string name)
    {
        object value = string.Empty;

        XElement child = doc1Childs.Where(x => x.Name == name).FirstOrDefault();

        if (child != null)
        {
            value = child.Value;
        }
        else
        {
            child = doc2Childs.Where(x => x.Name == name).FirstOrDefault();

            if(child != null)
                value = child.Value;
        }

        return value;
    }
}

用法:

XmlMatcher xmlManager = new XmlMatcher();

XDocument xml1 = XDocument.Load("Your Xm1 Path");
XDocument xml2 = XDocument.Load("Your Xm2 Path"); 
XDocument xml3 = xmlManager.MatchXmlFiles(xml1, xml2);
xml3.Save("Your Xm3 Path");

暫無
暫無

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

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