【问题标题】:Can not read values/nodes from xml using c#无法使用 c# 从 xml 读取值/节点
【发布时间】: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;   
        }
    }
}

我错过了什么?

谢谢大家

干杯

【问题讨论】:

    标签: c# xml xmldocument


    【解决方案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=.."
    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多