Solved

Help with combining XML Files using VB.NET

Posted on 2016-08-09
9
47 Views
1 Endorsement
Last Modified: 2016-08-11
Hi,

How do create an xml file with fields from 4 other xml files using VB.NET?

For example using two xml files, if the following two xml files contains multiple records with the following data elements:

File1.xml

<Root>
<Fields>
<ID>1</ID
<NSC>A</NSC>
<FIF>B</FIF>
<AGD>C</AGD>
<UVN>D</UVN>
</Fields
<Fields>
<ID>2</ID
<NSC>A1</NSC>
<FIF>B1</FIF>
<AGD>C1</AGD>
<UVN>D1</UVN>
</Fields
</Root>

File2.xml
<Root>
<Fields>
<ID>1</ID
<PFP>A</PFP>
<STL>B</STL>
<BGD>C</BGD>
<UVN>D</UVN>
</Fields
</Root>

How do I create one xml from the two files with no duplicate data elements?

<Root>
<Fields>
<ID>1</ID
<NSC></NSC>
<FIF></FIF>
<AGD></AGD>
<UVN></UVN>
<PFP></PFP>
<STL></STL>
<BGD></BGD>
</Fields
</Root>
Thanks,

victor
1
Comment
Question by:vcharles
  • 3
  • 3
  • 2
  • +1
9 Comments
 
LVL 9

Expert Comment

by:Paweł
ID: 41749822
What i would do is de-serialize the xmls into objects use linq to combine the objects into one array or list then serialize that collection to file.
0
 
LVL 12

Expert Comment

by:funwithdotnet
ID: 41749829
There's many ways to do that. Many experts use XDocument or XElement to process XML files.

For me, it depends on the schema, content and use. I like to read XML into DataSets. I'm comfortable with processing data using System.Data tools. Whenever the XML schema fits a database structure, I use DataTable.ReadXml.

For writing the XML, I usually do it manually, because the schema isn't usually very database-like. Basically, I just iterate through DataRows, formatting & appending string data. DataTables can write XML, but I think it's easier to get the correct finished product manually.

Good luck!
0
 
LVL 12

Expert Comment

by:funwithdotnet
ID: 41749831
For uniqueness in elements returned, there are a number of ways to do that. I would just go through all the field in all the data and compile a list of unique columns. Then as the data is read, I can determine if a value should be captured for a given output element.
0
The New “Normal” in Modern Enterprise Operations

DevOps for the modern enterprise offers many benefits — increased agility, productivity, and more, but digital transformation isn’t easy, especially if you’re not addressing the right issues. Register for the webinar to dive into the “new normal” for enterprise modern ops.

 
LVL 63

Accepted Solution

by:
Fernando Soto earned 500 total points
ID: 41750514
Hi Victor;

The following code snippet will do what you need.
'' Make a list of all the names to be compared in the query
Dim FileNames As New List(Of String) From {"..\..\file1.xml", "..\..\file2.xml"}
'' All the node names
Dim fields As List(Of String) = New List(Of String)
'' Go through all the files in the list to get the nodes names
For Each file As String In FileNames
    Dim xdoc = XDocument.Load(file)
    Dim nodeName As List(Of String) = (From f In xdoc.Descendants("Fields").Elements()
                                       Select f.Name.LocalName).ToList()
    fields.AddRange(nodeName)
Next
'' Fields now contains a list of all the Distinct field names
fields = fields.Distinct().ToList()
'' Create the new XML document with Distinct nodes
Dim newDoc = <Root>
                 <Fields>
                     <%= From n In fields
                         Select <<%= n %>/>
                     %>
                 </Fields>
             </Root>
'' Save the XML document to the file system
newDoc.Save("Main.xml")

Open in new window

0
 

Author Comment

by:vcharles
ID: 41750746
Hello,

Thank you for all the comments. I will try the code and get back to you.

Victor
0
 

Author Comment

by:vcharles
ID: 41751027
Hi Fernando,

The code works. Thank You.

is there a way to avoid including table names of the xml files in code below? Each xml file contains different tables.

Dim nodeName As List(Of String) = (From f In xdoc.Descendants(???).Elements()
                                       Select f.Name.LocalName).ToList()
Thanks,

Victor
0
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 41751263
Hi Victor;

Change the query to this.
Dim nodeName As List(Of String) = (From f In xdoc.Root.Elements().Elements()
                                   Select f.Name.LocalName).ToList()

Open in new window

0
 

Author Comment

by:vcharles
ID: 41751328
Thank you.
0
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 41751889
Hi Victor;

If the solution worked out for you please close the question.

Thanks
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

For those of you who don't follow the news, or just happen to live under rocks, Microsoft Research released a beta SDK (http://www.microsoft.com/en-us/download/details.aspx?id=27876) for the Xbox 360 Kinect. If you don't know what a Kinect is (http:…
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

830 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question