2017-07-31 40 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; 
}