无法使用 c# 从 xml 读取值/节点

Posted

技术标签:

【中文标题】无法使用 c# 从 xml 读取值/节点【英文标题】:Can not read values/nodes from xml using c# 【发布时间】:2020-09-03 07:00:21 【问题描述】:

我正在尝试从以下 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;   
        
    

我错过了什么?

谢谢大家

干杯

【问题讨论】:

【参考方案1】:

您的eventdata 节点有自己的xmlns 声明,您应该使用XmlNamespaceManager 正确处理它并选择带有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;

【讨论】:

这就是我必须使用 XmlNamespaceManager.. 的唯一原因,因为根节点有自己的 xmlns 声明? @Roxy'Pro 是的,因为您的 xml 命名空间与默认命名空间不同,列于 remarks【参考方案2】:

使用以下代码读取测量值

   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;
                                    
                                

                            
                        

                    
                
            

【讨论】:

如何在时间节点下得到&lt;value type=.."

以上是关于无法使用 c# 从 xml 读取值/节点的主要内容,如果未能解决你的问题,请参考以下文章

无法在 C# 中读取 XML 节点

C#如何读取XML中指定的节点值?

无法将 XML 读取到对象

使用 C# 客户端读取 OPC UA 节点属性值

无法使用 XML 文件的 PHP 读取子节点

C# XML 反序列化为一张表中的 DataSet