2017-07-31 101 views
1

我有兩個XML文件更新XML文件沒有循環

main.xml中

<?xml version="1.0" standalone="yes"?> 
<NewDataSet> 
    <Table> 
    <RowNo>1</RowNo> 
    <BatchMId>632</BatchMId> 
    <RandomNo>513EHGPDX9GH</RandomNo> 
    <ParentRandomNo>0000003</ParentRandomNo> 
    <Status>6</Status> 
    <AggregrationTimestamp>08/06/2017 1:07:28 </AggregrationTimestamp> 
    <CommissioningTimestamp>06/06/2017 17:26:31</CommissioningTimestamp> 
    <Grade>A</Grade> 
    </Table> 
    <Table> 
    <RowNo>2</RowNo> 
    <BatchMId>632</BatchMId> 
    <RandomNo>6S91XPK1Y8AV</RandomNo> 
    <ParentRandomNo>0000004</ParentRandomNo> 
    <Status>6</Status> 
    <AggregrationTimestamp>08/06/2017 1:07:28 </AggregrationTimestamp> 
    <CommissioningTimestamp>06/06/2017 17:26:31</CommissioningTimestamp> 
    <Grade>A</Grade> 
    </Table> 
</NewDataSet> 

Change.xml

<?xml version="1.0" standalone="yes"?> 
<NewDataSet> 
    <Table> 
    <RowNo>1</RowNo> 
    <BatchMId>632</BatchMId> 
    <RandomNo>513EHGPDX9GH</RandomNo> 
    <ParentRandomNo>0000003</ParentRandomNo> 
    <Status>5</Status> 
    <AggregrationTimestamp>09/06/2017 11:07:28 </AggregrationTimestamp> 
    <CommissioningTimestamp>09/06/2017 11:07:28</CommissioningTimestamp> 
    <Grade>B</Grade> 
    </Table> 
</NewDataSet> 

在兩文件<randomno>是唯一的,兩個文件都是相同的。 Change.xml只是有一些更新的元素值。

,現在我想用這些變化更新main.xml中,需要這樣的輸出..

<?xml version="1.0" standalone="yes"?> 
<NewDataSet> 
    <Table> 
    <RowNo>1</RowNo> 
    <BatchMId>632</BatchMId> 
    <RandomNo>513EHGPDX9GH</RandomNo> 
    <ParentRandomNo>0000003</ParentRandomNo> 
    <Status>5</Status> 
    <AggregrationTimestamp>09/06/2017 11:07:28 </AggregrationTimestamp> 
    <CommissioningTimestamp>09/06/2017 11:07:28</CommissioningTimestamp> 
    <Grade>B</Grade> 
    </Table> 
    <Table> 
    <RowNo>2</RowNo> 
    <BatchMId>632</BatchMId> 
    <RandomNo>6S91XPK1Y8AV</RandomNo> 
    <ParentRandomNo>0000004</ParentRandomNo> 
    <Status>6</Status> 
    <AggregrationTimestamp>08/06/2017 1:07:28 </AggregrationTimestamp> 
    <CommissioningTimestamp>06/06/2017 17:26:31</CommissioningTimestamp> 
    <Grade>A</Grade> 
    </Table> 
</NewDataSet> 

我有一個最低爲500000個記錄在這個文件中,我想不用來更新這個XML文件在C#中的任何循環。如果有人對此有所瞭解,請告訴我。我嘗試使用for循環,但需要更多時間來更新它。 因此,如果任何人有一個沒有循環的想法,然後與我分享。

+5

問題拋開,如果你使用循環或爲什麼不重要?循環本身並不是邪惡的......如果需要很長時間,那麼它就是你設置它的方式。你能發佈你使用的代碼嗎? –

+0

首先,顯示你的代碼(帶循環)並描述你的問題(執行時間太長)。然後,我們會盡力找到您的問題和/或提出解決方案,它的工作原理 –

+0

然後創建一個字典,使其更快地定位記錄。 – jdweng

回答

0

嘗試下面進入詞典:

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

namespace ConsoleApplication71 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      Dictionary<string, XElement> dict = doc.Descendants("Table").GroupBy(x => (string)x.Element("RandomNo"), y => y).ToDictionary(x => x.Key, y => y.FirstOrDefault()); 
     } 
    } 
} 
0

這裏是你的代碼。工作完美。來源是你的來源集和變化是在變化集

DataSet changeSet = new DataSet(); 
changeSet.ReadXml("d:\\change.xml"); 
DataSet sourceSet = new DataSet(); 
sourceSet.ReadXml("d:\\source.xml"); 
sourceSet.Tables[0].PrimaryKey = new DataColumn[] { sourceSet.Tables[0].Columns["ParentRandomNo"] }; 
changeSet.Tables[0].PrimaryKey = new DataColumn[] { changeSet.Tables[0].Columns["ParentRandomNo"] }; 
try 
{ 
    sourceSet.Merge(changeSet, false); 
    sourceSet.AcceptChanges(); 
    sourceSet.WriteXml("d:\\updated.xml"); 
} 
catch (Exception) 
{ 
    throw; 
}