Solved

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

Posted on 2004-04-28
4
383 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

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Bit flags and bit flag manipulation is perhaps one of the most underrated strategies in programming, likely because most programmers developing in high-level languages rely too much on the high-level features, and forget about the low-level ones. Th…
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.
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

708 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

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now