[RESOLVED] Merge multiple XML files to a single XML file.
I would like to find an example using Linq to Xml that will merge n number of Xml Files.
I already have this code from MSDN that does this, but it doesn't use Linq.
C# Code:
try
{
XmlTextReader xmlreader1 = new XmlTextReader("C:\\Books1.xml");
XmlTextReader xmlreader2 = new XmlTextReader("C:\\Books2.xml");
DataSet ds = new DataSet();
ds.ReadXml(xmlreader1);
DataSet ds2 = new DataSet();
ds2.ReadXml(xmlreader2);
ds.Merge(ds2);
ds.WriteXml("C:\\Books.xml");
Console.WriteLine("Completed merging XML documents");
}
catch (System.Exception ex)
{
Console.Write(ex.Message);
}
Console.Read();
I want to check if Linq is faster than the above method.
I have something along the lines of this code snippet.
C# Code:
var xml1 = XDocument.Load("C:\\Books1.xml");
var xml2 = XDocument.Load("C:\\Books2.xml");
//Combine and remove duplicates
var combined = xml1.Descendants("AllNodes")
.Union(xml2.Descendants("AllNodes"));
combined is of type System.Linq.Enumerable.UnionIterator<System.Xml.Linq.XElement>
How do I serialize it to an XML file?
Re: Merge multiple XML files to a single XML file.
Might be a little off without having some sample xml documents to work with.
Code:
var xml1 = XDocument.Load("C:\Temp\Books1.xml");
var xml2 = XDocument.Load("C:\Temp\Books2.xml");
xml1.Descendants("AllBooks").FirstOrDefault()
.Add(xml2.Descendants("AllBooks").FirstOrDefault().Nodes());
xml1.Save("C:\Temp\CombinedBooks.xml");
Re: Merge multiple XML files to a single XML file.
Hi MattP,
Thanks for the response. Firstly I apologize that I did not post the files in question. Both files have root elements.
So the structure looks something like this.
PHP Code:
<Root>
<Books>
<Book Id="AAHAH">
<TITLE>Paths of Glory</TITLE>
<AUTHOR>Jeffrey Archer</AUTHOR>
<YEAR>2010</YEAR>
</Book>
</Books>
</Root>
I realize that your method will not work for me. I will have to do something along the lines of selecting elements from both xml files and then merging them.
Regards,
Abhijit
Re: Merge multiple XML files to a single XML file.
Maybe I'm not understanding you correctly.
Here's my Books1.xml that I used:
Code:
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Books>
<Book Id="Book1">
<TITLE>Title of Book 1</TITLE>
<AUTHOR>Author of Book 1</AUTHOR>
<YEAR>2010</YEAR>
</Book>
<Book Id="Book2">
<TITLE>Title of Book 2</TITLE>
<AUTHOR>Author of Book 2</AUTHOR>
<YEAR>2011</YEAR>
</Book>
</Books>
</Root>
And Books2.xml:
Code:
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Books>
<Book Id="Book3">
<TITLE>Title of Book 3</TITLE>
<AUTHOR>Author of Book 3</AUTHOR>
<YEAR>2006</YEAR>
</Book>
<Book Id="Book4">
<TITLE>Title of Book 4</TITLE>
<AUTHOR>Author of Book 4</AUTHOR>
<YEAR>2000</YEAR>
</Book>
</Books>
</Root>
Here's the code I used to test with:
Code:
var xml1 = XDocument.Load("C:\\Temp\\Books1.xml");
var xml2 = XDocument.Load("C:\\Temp\\Books2.xml");
xml1.Descendants("Books").FirstOrDefault().Add(xml2.Descendants("Books").FirstOrDefault().Nodes());
xml1.Save("C:\\Temp\\CombinedBooks.xml");
And here's the resultant CombinedBooks.xml:
Code:
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Books>
<Book Id="Book1">
<TITLE>Title of Book 1</TITLE>
<AUTHOR>Author of Book 1</AUTHOR>
<YEAR>2010</YEAR>
</Book>
<Book Id="Book2">
<TITLE>Title of Book 2</TITLE>
<AUTHOR>Author of Book 2</AUTHOR>
<YEAR>2011</YEAR>
</Book>
<Book Id="Book3">
<TITLE>Title of Book 3</TITLE>
<AUTHOR>Author of Book 3</AUTHOR>
<YEAR>2006</YEAR>
</Book>
<Book Id="Book4">
<TITLE>Title of Book 4</TITLE>
<AUTHOR>Author of Book 4</AUTHOR>
<YEAR>2000</YEAR>
</Book>
</Books>
</Root>
You say you've got n number of files to go through. Just keep adding the nodes to xml1.Descendants("Books").FirstOrDefault() and then save the merged files when you're done.
Code:
var xml1 = XDocument.Load(@"C:\Temp\Books1.xml");
var xml2 = XDocument.Load(@"C:\Temp\Books2.xml");
xml1.Descendants("Books").FirstOrDefault().Add(xml2.Descendants("Books").FirstOrDefault().Nodes());
var xml3 = XDocument.Load(@"C:\Temp\Books3.xml");
xml1.Descendants("Books").FirstOrDefault().Add(xml3.Descendants("Books").FirstOrDefault().Nodes());
xml1.Save("C:\\Temp\\CombinedBooks.xml");
If you're looking for something different then I'll need a little more information on what you'd like the end result to look like before I can help.