Search code examples
c#xmlxmldocument

Can not read values/nodes from xml using c#


I'm trying to read values from following xml (which is previously fetched from FTP):

<?xml version="1.0" encoding="utf-8"?>
<eventdata xmlns="http://www.demoweb.net/xml/eventdata" >
<site>
<sitelink>demotesting</sitelink>
<user>15101991</user>
<measurement>
 <nodelink>012019120312064500</nodelink>
 <containername>A1</containername>
 <time>2020-04-30T11:25:35</time>
 <value type="n_v_unitvalue">0.04</value>
 <value type="n_v_unitvalue_diff">0.040</value>
</measurement>
<measurement>
 <nodelink>012019120312064501</nodelink>
 <containername>A2</containername>
 <time>2020-04-30T11:25:35</time>
 <value type="n_v_unitvalue">0.0</value>
 <value type="n_v_unitvalue_diff">-0.001</value>
</measurement>
<measurement>
 <nodelink>012019120312064502</nodelink>
 <containername>A3</containername>
 <time>2020-04-30T11:25:34</time>
 <value type="n_v_unitvalue">0.0</value>
 <value type="n_v_unitvalue_diff">0.000</value>
</measurement>
</site>
<createdate>2020-04-30T11:25:35</createdate>
</eventdata>

Before I start, file is sucessfully loaded into memory :)

As you can see root node is eventdata, and site is the node where all data is contained. So basically I need to loop all measurement nodes and get the data.

I also were struggling to get out user node.. here's what I've tried so far:

using (StreamReader xml_reader = new StreamReader(xml_response.GetResponseStream()))
{
    string xml = xml_reader.ReadToEnd();
    XmlDocument xmldoc = new XmlDocument();
    xmldoc.LoadXml(xml);

    XmlNodeList mainFileContent = xmldoc.SelectNodes("eventdata");
    // XmlNodeList mainFileContent = xmldoc.SelectNodes("eventdata/site");
    XmlElement root = xmldoc.DocumentElement;

    if (mainFileContent != null)
    {
        foreach (XmlNode node in mainFileContent)
        {
            var user = node["user"].InnerText;   
        }
    }
}

What I'm missing?

THANKS GUYS

CHEERS


Solution

  • Your eventdata node has own xmlns declaration, you should properly handle it using XmlNamespaceManager and select the nodes with x:eventdata/x:site XPath expression

    var xmldoc = new XmlDocument();
    xmldoc.LoadXml(xml);
    
    var nsmgr = new XmlNamespaceManager(xmldoc.NameTable);
    nsmgr.AddNamespace("x", xmldoc.DocumentElement.NamespaceURI);
    
    var mainFileContent = xmldoc.SelectNodes("x:eventdata/x:site", nsmgr);
    foreach (XmlNode node in mainFileContent)
    {
        var user = node["user"]?.InnerText;
    }