Solved

PLEASE HELP ME -- how to get data from a xml file using C#?

Posted on 2004-04-28
4
386 Views
Last Modified: 2010-04-15
Hi, all,
i have a xml file like:
- <FORM name="Work Order">
  <CONTROL type="edittext" id="1000" windowtext="17089" order="0" key="15747">17089</CONTROL>
  <CONTROL type="edittext" id="1018" windowtext="TM1504" order="4" key="1064">TM1504</CONTROL>  
+ <CONTROL type="tabpane" id="106" windowtext="" order="6">
- <TAB name="Contractor">
  <CONTROL type="edittext" id="1211" windowtext="" order="2" />
  </TAB>
- <TAB name="Costs">
- <CONTROL type="tabpane" id="801" windowtext="" order="67">
- <TAB name="Labour">
- <CONTROL type="grid" id="1300" windowtext="" order="9" rows="1" cols="35">
- <ROW order="1">
  <COL name="Activity" order="1">TM1504</COL>
  <COL name="ACTDESC" order="2">P MACH - BREAKDOWN MAINTENANCE</COL>
  <COL name="Task" order="3" />
  <COL name="TASKKEY" order="4">1</COL>
  <COL name="" order="5">15747</COL>
  <COL name="Charge Date" order="6">12/08/1997</COL>
  <COL name="" order="7">10:44</COL>
  <COL name="Crew Type" order="8" />
  <COL name="Job Class" order="9" />
  <COL name="Employee ID" order="10">100236</COL>
  </ROW>
  </CONTROL>
  <CONTROL type="edittext" id="4216" windowtext="22.55" order="14">22.55</CONTROL>
  <CONTROL type="edittext" id="1316" windowtext="22.55" order="15">22.55</CONTROL>
  </TAB>
- <TAB name="Extra Item">
  <CONTROL type="grid" id="1470" windowtext="" order="44" rows="0" cols="19" />
  <CONTROL type="edittext" id="4216" windowtext="0.00" order="49">0.00</CONTROL>
  <CONTROL type="edittext" id="1479" windowtext="0.00" order="50">0.00</CONTROL>
  </TAB>
  </CONTROL>
  </TAB>
  </FORM>

this xml file is very complex.
I have to explain the structure : form "work order" has a few tabs, each tab may have a few subtabs, each tab may have a data grid ( like a table), each data grid has many rows, each row has many columns.

i have to read data from this xml file, for example, get  "Employee ID"  from this path :
tab name = "Cost" > subtab name = "Labour" > control type = "grid" > Row order = 1 > COL name = 'Employee ID"

how can i get ALL 'employee id' IN A DATA GRID by using C# ?  USING XPathNavigator,XmlTextReader or something else? could you please give me some example code? i really have no idea for how to do it.

many thanks
viola

0
Comment
Question by:viola123
4 Comments
 
LVL 21

Expert Comment

by:tovvenki
ID: 10946321
Hi,
can you try this
      Dim myDataSet as New DataSet()
   
        myDataSet.ReadXml(Server.MapPath("your xmlfile.xml"))
   
        dgBooks.DataSource = myDataSet
        dgBooks.DataBind()

Hope that this helps you.

Regards,
venki
0
 
LVL 2

Expert Comment

by:Vaishali_chaudhry
ID: 10946672
try using a  XMLReader ,if you actually want to go through each tab and check its significance...A sample code that i am using..

private void readCoumns(string TableName)
            {
                  bool foundTable=false;
                  String str;
                  rdr=new XmlTextReader(@"c:\multij\Employ4.xml");
                  while (rdr.Read() && !foundTable)
                  {
                        switch (rdr.NodeType)
                        {
                              case XmlNodeType.Element:
                                    str=rdr.Name;
                                          if(str.Equals("Table"))
                                    {
                                          rdr.MoveToNextAttribute();
                                          if(rdr.Value.Equals(TableName))
                                          {
                                                foundTable=true;
                                                int i=0;
                                                ctxMenuDetail.MenuItems.Clear();
                                                while(rdr.Read())
                                                {
                                                      if(rdr.Name.Equals("Column"))
                                                      {
                                                            rdr.MoveToNextAttribute();
                                                            ctxMenuDetail.MenuItems.Add(rdr.Value);
                                                            ctxMenuDetail.MenuItems[i++].Click+=new System.EventHandler(this.DetailMenuItemHandler);
                                                      }      
                                                      if(rdr.Name.Equals("PrimaryKey"))
                                                      {
                                                            break;
                                                      }
                                                }
                                          }
                                    }
                                    break;
                        }
                  }
                  rdr.Close();
            }

0
 
LVL 9

Accepted Solution

by:
Thalox earned 500 total points
ID: 10946729

the above solution will bind the whole xml in a grid

if you only need the employeeid you can use the following

XmlDocument doc = new XmlDocument();
doc.Load("xmlfile");
            
// this will select all COL-nodes with name = Employee ID from the specified ROW - node
XmlNodeList nodes = doc.DocumentElement.SelectNodes("/FORM/TAB[name='Cost']/TAB[name='Labour']/CONTROL[type='grid']/ROW[order='1']/COL[name='Employee ID']");      

// if it doesnt matter where (in which level / parent node) the nodes exist you could also write
XmlNodeList nodes = doc.DocumentElement.SelectNodes("//COL[name='Employee ID']");

// go through nodes and get value
string[] src = new string[nodes.Count];

for (int i = 0; i < src.Length; i++) {
   src[i] = nodes[i].Value;
}

// bind to grid
dg.DataSource = src;
dg.DataBind();


Thalox
0
 
LVL 6

Author Comment

by:viola123
ID: 10955179
hi, Thalox,
 i figured out this problem. code is the following:

---select only one 'employee ID'
string nd = "" ;
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(strXMLFile);

// because type, name, order ... they all attributes of that node, so must use '@' to specify those attributes
XmlNode node = xmldoc.DocumentElement.SelectSingleNode("CONTROL[@type='tabpane']/TAB[@name='Costs']/CONTROL[@type='tabpane']/TAB[@name='Labour']/CONTROL[@type='grid']/ROW[@order='1']/COL[@name='Employee ID']");

//if you want to get value, please use 'InnerText' NOT 'Value'
nd = node.InnerText;

---select all 'employee ID'
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(strXMLFile);

XmlNodeList nodes = xmldoc.DocumentElement.SelectNodes("//COL[@name='Employee ID']");
string[] src = new string[nodes.Count];

for (int i = 0; i < src.Length; i++)
{
     src[i] = nodes[i].InnerText;
}

anyway, you gave me the whole idea. thank you very much.

BTW, tovvenki and vaishali chaudhry, thanks for your help.
viola
0

Featured Post

NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Diagnostics with Net and Net.Sockets 2 30
Device Location 4 31
Simple Injector with Web Service 4 46
HttpPostedFile 1 26
Summary: Persistence is the capability of an application to store the state of objects and recover it when necessary. This article compares the two common types of serialization in aspects of data access, readability, and runtime cost. A ready-to…
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

825 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