walkercheah
walkercheah

Reputation: 1

Xml file with C# can't get the value

Here is my xml file

<?xml version="1.0" encoding="ASCII"?>
<Vitals>
<Vendor>General Electric Healthcare</Vendor>
<Model>Pro/Procare</Model>
    <Result name="Mean_arterial_pressure">
        <Value>86</Value>
        <Units name="mmHg"></Units>
        <Time_stamp year="2008" month="11" day="18" hour="12" minute="33" second="14"></Time_stamp>
    </Result>
    <Result name="Systolic_blood_pressure">
        <Value>130</Value>
        <Units name="mmHg"></Units>
        <Time_stamp year="2008" month="11" day="18" hour="12" minute="33" second="14"></Time_stamp>
    </Result>
    <Result name="Diastolic_blood_pressure">
        <Value>67</Value>
        <Units name="mmHg"></Units>
        <Time_stamp year="2008" month="11" day="18" hour="12" minute="33" second="14"></Time_stamp>
    </Result>
    <Result name="Pulse">
        <Value>73</Value>
        <Units name="BPM"></Units>
        <Method>blood_pressure</Method>
        <Time_stamp year="2008" month="11" day="18" hour="12" minute="33" second="14"></Time_stamp>
  </Result>
</Vitals>

and Here is my sourcecode, I having the issue how to get the result name and the value?

private void btnReadXml_Click(object sender, EventArgs e)
{

    Hashtable h = new Hashtable();
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("C:\\dinamap.xml");


    XmlNodeList doc_results = xmlDoc.GetElementsByTagName("Vitals/Vendor/Model/Result[@name='Systolic_blood_pressure']");
    foreach (XmlNode pnode in doc_results)
    {
        foreach (XmlNode cnode in pnode.ChildNodes)
        {
            if (cnode.Name == "Value")
            {
                h.Add(pnode.Attributes["name"].InnerText + cnode.Name, cnode.Attributes["name"].InnerText);
            }
            else
            {
                h.Add(pnode.Attributes["name"].InnerText + "_" + cnode.Name, cnode.InnerText);
            }
        }      
    }
}

May I know what wrong of my code? always can't get the value.
I need to get the value from xml file.

Upvotes: 0

Views: 50

Answers (4)

walkercheah
walkercheah

Reputation: 1

private void btnReadXml_Click(object sender, EventArgs e)
        {

            var doc = XDocument.Load("C:\\dinamap.xml");

            var results = from result in doc.Descendants("Result")
                          select new
                          {
                              Name = (string)result.Attribute("name"),
                              Value = (string)result.Element("Value"),
                              Units = (string)result.Element("Units").Attribute("name")
                          };

            foreach (var result in results)
            {
                MessageBox.Show("{result.Name}: {result.Value} {result.Units}");

            }
         
        }

Upvotes: 0

Charles Mager
Charles Mager

Reputation: 26213

It'd be easier if you used LINQ to XML for this.

var doc = XDocument.Load("path/to/xml");

var results =
    from result in doc.Descendants("Result")
    select new
    {
        Name = (string) result.Attribute("name"),
        Value = (string) result.Element("Value"),
        Units = (string) result.Element("Units").Attribute("name")
    };

You could then filter by Name if you needed:

var sysBp = results.Single(x => x.Name == "Systolic_blood_pressure");

See this fiddle for a working demo.

Upvotes: 0

IAmJersh
IAmJersh

Reputation: 809

You're currently trying to retrieve the "name" attribute of the child node, which it does not actually have in the case of your value node. If you use cnode.Value you can get the contents of a text note.

Also, Result is not a child of Model, which is not a child of Vendor. You'll either want to properly make them children or change the path you're setting for doc_results

Upvotes: 0

GGO
GGO

Reputation: 2748

On line 5, your xPath specify Model is a child of Vendor while Vendor contains only a string (<Vendor>General Electric Healthcare</Vendor>).

Moreover, to navigate with xPath i advice you to use SelectNodes function.

Try this instead :

XmlNodeList doc_results = xmlDoc.SelectNodes("/Vitals/Model/Result[@name='Systolic_blood_pressure']");

Upvotes: 1

Related Questions