Amol Kolekar
Amol Kolekar

Reputation: 2325

How to get multiple tables in Dataset from XML


I am reading XML inside the Dataset.Following is my XML structure.

XML:-

 <?xml version="1.0" encoding="utf-8" ?> 
  <root>
       <ClaimHomePage>
           <item>
                <controlID>txtHospitalName</controlID>
                <rolesEnabled>Non Medico,Medico,Auditor,CMO</rolesEnabled>
                <rolesVisible>Non Medico,Medico,Auditor,CMO</rolesVisible>
          </item>
          <item>
                <controlID>txtHospitalAddress</controlID>
                <rolesEnabled>Non Medico,Medico,Auditor,CMO</rolesEnabled>
                <rolesVisible>Non Medico,Medico,Auditor,CMO</rolesVisible>
          </item>
          <item>
                <controlID>txtAuthorizeAmount</controlID>
                <rolesEnabled>Non Medico,Medico,Auditor,CMO</rolesEnabled>
                <rolesVisible>Non Medico,Medico,Auditor,CMO</rolesVisible>
          </item>
          <item>
               <controlID>txtDtTmOfAdmission</controlID>
               <rolesEnabled>Non Medico,Medico,Auditor,CMO</rolesEnabled>
               <rolesVisible>Non Medico,Medico,Auditor,CMO</rolesVisible>
          </item>  
       </ClaimHomePage>
       <ClaimBillDetailHC>
          <item>
               <controlID>txtHospitalName</controlID>
               <rolesEnabled>Non Medico,Medico,Auditor,CMO</rolesEnabled>
               <rolesVisible>Non Medico,Medico,Auditor,CMO</rolesVisible>
          </item>
          <item>
               <controlID>txtHospitalAddress</controlID>
               <rolesEnabled>Non Medico,Medico,Auditor,CMO</rolesEnabled>
               <rolesVisible>Non Medico,Medico,Auditor,CMO</rolesVisible>
          </item>
          <item>
               <controlID>txtAuthorizeAmount</controlID>
               <rolesEnabled>Non Medico,Medico,Auditor,CMO</rolesEnabled>
               <rolesVisible>Non Medico,Medico,Auditor,CMO</rolesVisible>
          </item>
          <item>
               <controlID>txtDtTmOfAdmission</controlID>
               <rolesEnabled>Non Medico,Medico,Auditor,CMO</rolesEnabled>
               <rolesVisible>Non Medico,Medico,Auditor,CMO</rolesVisible>
          </item>
       </ClaimBillDetailHC>
  </root>

enter code here

There are two root nodes inside the main root node(i.e. ClaimHomePage,ClaimBillDetailHC).
I want to write a code so that when i create Dataset from this XML,there should be two tables (i.e ClaimHomePage & ClaimBillDetailHC) present in the Dataset.
Please provide some help...

Upvotes: 0

Views: 3829

Answers (1)

KV Prajapati
KV Prajapati

Reputation: 94653

Use Relations collection. I think this is the direct way to get table instance.

DataSet ds = new DataSet();
ds.ReadXml(file);
 if (ds.Relations.Count == 2)
  {
     DataTable first = ds.Relations[0].ChildTable;
     DataTable second = ds.Relations[0].ChildTable;

     Console.WriteLine("Table  : " + ds.Relations[0].ParentTable.TableName);
     foreach (DataRow  row in first.Rows)
       Console.WriteLine(row["controlID"] + " " + row["rolesEnabled"] + " " + row["rolesVisible"]);
 }

You have to read XML document using DOM or Linq to XML API and then after you may populate DataSet/DataTable.

For instance (Linq to XML)

 XDocument doc = XDocument.Load(file);
 //List from ClaimHomePage 
 var ClaimHomePage = from ele in doc.Root.Element("ClaimHomePage").Descendants("item")
                            select new
                            {
                                 ControlID=(string)ele.Element("controlID"),
                                 rolesEnabled = (string)ele.Element("rolesEnabled"),
                                 rolesVisible = (string)ele.Element("rolesVisible"),
                            };
  var ClaimBillDetailHC= from ele in doc.Root.Element("ClaimBillDetailHC").Descendants("item")
                            select new
                            {
                                 ControlID=(string)ele.Element("controlID"),
                                 rolesEnabled = (string)ele.Element("rolesEnabled"),
                                 rolesVisible = (string)ele.Element("rolesVisible"),
                            };

And then traverse the lists and populate DataTable/DataSet.

Upvotes: 2

Related Questions