2016-06-08 81 views
2

我已經編輯了這個小MSDN例如https://support.microsoft.com/en-us/kb/311530總和相同的命名XML節點

和我有以下2 XML的

Book1.xml

<?xml version="1.0"?> 
<catalog> 
<book1 id="1" /> 
<bookSum number="1" /> 
</catalog> 

列出book2.xml

<?xml version="1.0"?> 
<catalog> 
<book2 id="2" /> 
<bookSum number="1" specialAttribute="123" /> 
</catalog> 

C#代碼

XmlReader xmlreader1 = XmlReader.Create(@"C:\Book1.xml"); 
XmlReader xmlreader2 = XmlReader.Create(@"C:\book2.xml"); 

DataSet ds = new DataSet(); 
ds.ReadXml(xmlreader1); 
DataSet ds2 = new DataSet(); 
ds2.ReadXml(xmlreader2); 
ds.Merge(ds2); 
ds.WriteXml(@"C:\Merge.xml"); 
Console.WriteLine("Completed merging XML documents"); 

的merge.xml(Book1.xml +列出book2.xml)

<?xml version="1.0" standalone="yes"?> 
<catalog> 
    <book1 id="1" /> 
    <bookSum number="1" /> 
    <bookSum number="1" specialAttribute="x" /> 
    <book2 id="2" /> 
</catalog> 

,問題是

如何加入

<bookSum number="1" /> 
<bookSum number="1" specialAttribute="123" /> 

成一條線?

<bookSum number="2" specialAttribute="123" /> 

回答

0

我就是這麼做的,並且工作:

var doc = XDocument.Load(@"C:\Book1.xml"); 
doc.Root.Add(XDocument.Load(@"C:\Book2.xml").Root.Elements()); // merged 

var sum = doc.Descendants("bookSum").Attributes("number").Sum(t => int.Parse(t.Value)); 

var xElement = new XElement("bookSum", new XAttribute("number", sum)); 
foreach(var attrib in doc.Descendants("bookSum").Attributes()) 
{ 
    if (xElement.Attribute(attrib.Name) == null) 
     xElement.Add(attrib); 
} 

doc.Descendants("bookSum").ToList().ForEach(t => t.ReplaceWith(xElement)); 
doc.Root.Descendants("bookSum").First().Remove(); 
Console.WriteLine(doc); 
+1

謝謝你,它的工作原理,但對重複數據刪除我換成 doc.Root.Descendants( 「bookSum」)第一()刪除。 (); 與 int i = 1; (); if(i> 1) node.Remove();如果(i> 1) if(i> 1) i ++; } – Muflix