无法使用 c# 从 xml 读取 values/nodes

Can not read values/nodes from xml using c#

我正在尝试从以下 xml 中读取值(之前从 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>

在我开始之前,文件已成功加载到内存中:)

可以看到根节点是eventdatasite是包含所有数据的节点。 所以基本上我需要循环所有 measurement 节点并获取数据。

我也在努力摆脱用户节点..这是我到目前为止尝试过的方法:

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;   
        }
    }
}

我错过了什么?

谢谢大家

干杯

使用下面的代码读取测量结果

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

                var nsmgr = new XmlNamespaceManager(xmldoc.NameTable);
                nsmgr.AddNamespace("ns", "http://www.demoweb.net/xml/eventdata");
                XmlNodeList mainFileContent = xmldoc.SelectNodes("ns:eventdata/ns:site",nsmgr);
                XmlElement root = xmldoc.DocumentElement;

                if (mainFileContent != null)
                {
                    foreach (XmlNode site in mainFileContent)
                    {
                        var user = site["user"].InnerText;
                        XmlNodeList measurements = site.SelectNodes("ns:measurement", nsmgr);
                        if (measurements != null)
                        {
                            foreach (XmlNode measurement in measurements)
                            {
                                var containername = measurement["containername"].InnerText;
                                var time = measurement["time"].InnerText;
                                XmlNodeList values = measurement.SelectNodes("ns:value", nsmgr);
                                if (values != null)
                                {
                                    foreach (XmlNode value in values)
                                    {
                                        var type = value.Attributes["type"].Value;
                                        var v2 = value.InnerText;
                                    }
                                }

                            }
                        }

                    }
                }
            }

您的 eventdata 节点有自己的 xmlns 声明,您应该使用 XmlNamespaceManager 和 select 具有 x:eventdata/x:site XPath 表达式的节点正确处理它

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;
}