无法使用 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>
在我开始之前,文件已成功加载到内存中:)
如您所见,根节点是eventdata
,site
是包含所有数据的节点。
所以基本上我需要循环所有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;
【讨论】:
如何在时间节点下得到<value type=.."
?以上是关于无法使用 c# 从 xml 读取值/节点的主要内容,如果未能解决你的问题,请参考以下文章