【发布时间】:2016-02-24 13:38:22
【问题描述】:
这里有一个小问题,我正在为客户将传统的经典 ASP 应用程序转换为 ASP.NET 4.5,并且需要从 XML 文件中提取数据,但我无法获得单个节点的值,我的代码什么也不返回。
XML 文件
<?xml version="1.0" encoding="UTF-8"?>
<Devices-Detail-Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.embeddeddatasystems.com/schema/owserver">
<PollCount>150722</PollCount>
<DevicesConnected>4</DevicesConnected>
<LoopTime>3.974</LoopTime>
<DataErrors>2</DataErrors>
<DeviceName>OW_SERVER-Enet</DeviceName>
<HostName>EDSOWSERVER</HostName
<MACAddress>00:50:C2:91:B3:9C</MACAddress>
<owd_DS18B20 Description="Programmable resolution thermometer">
<Name>DS18B20</Name>
<Family>28</Family>
<ROMId>2D0000023C519A28</ROMId>
<Health>7</Health>
<RawData>0E014B467FFF021000000</RawData>
<PrimaryValue>16.8750 Deg C</PrimaryValue>
<Temperature Units="Centigrade">16.8750</Temperature>
<UserByte1 Writable="True">75</UserByte1>
<UserByte2 Writable="True">70</UserByte2>
<Resolution>12</Resolution>
<PowerSource>0</PowerSource>
</owd_DS18B20>
<owd_DS18B20 Description="Programmable resolution thermometer">
<Name>DS18B20</Name>
<Family>28</Family>
<ROMId>DA000002E0E5A928</ROMId>
<Health>7</Health>
<RawData>32014B467FFF0E101E000000</RawData>
<PrimaryValue>19.1250 Deg C</PrimaryValue>
<Temperature Units="Centigrade">19.1250</Temperature>
<UserByte1 Writable="True">75</UserByte1>
<UserByte2 Writable="True">70</UserByte2>
<Resolution>12</Resolution>
<PowerSource>0</PowerSource>
</owd_DS18B20>
<owd_DS18B20 Description="Programmable resolution thermometer">
<Name>DS18B20</Name>
<Family>28</Family>
<ROMId>C3000002E0EE1B28</ROMId>
<Health>7</Health>
<RawData>1D014B467FFF0310C5000000</RawData>
<PrimaryValue>17.8125 Deg C</PrimaryValue>
<Temperature Units="Centigrade">17.8125</Temperature>
<UserByte1 Writable="True">75</UserByte1>
<UserByte2 Writable="True">70</UserByte2>
<Resolution>12</Resolution>
<PowerSource>0</PowerSource>
</owd_DS18B20>
<owd_DS18B20 Description="Programmable resolution thermometer">
<Name>DS18B20</Name>
<Family>28</Family>
<ROMId>070000023DBB7F28</ROMId>
<Health>7</Health>
<RawData>52014B467FFF0E10FFFF0000000000000000</RawData>
<PrimaryValue>21.1250 Deg C</PrimaryValue>
<Temperature Units="Centigrade">21.1250</Temperature>
<UserByte1 Writable="True">75</UserByte1>
<UserByte2 Writable="True">70</UserByte2>
<Resolution>12</Resolution>
<PowerSource>255</PowerSource>
</owd_DS18B20>
</Devices-Detail-Response>
我需要能够根据 ROMId 获取温度值,因为任何时候最多可以连接 22 个传感器。
我尝试了以下方法,但总是没有任何结果:
Imports System.Xml
Dim m_xmld As XmlDocument
Dim m_nodelist As XmlNodeList
Dim m_node As XmlNode
Dim Temperature As String = String.Empty
m_xmld = New XmlDocument()
m_xmld.Load("http://" & server_ip & "/details.xml")
Dim m_xmlns As New XmlNamespaceManager(m_xmld.NameTable)
m_xmlns.AddNamespace("opsm_ns", "http://tempuri.org/zitem.xsd")
For Each node As XmlNode In
m_xmld.SelectNodes("//opsm_ns:owd_DS18B20[ROMId='" & deviceId & "']",m_xmlns)
Console.WriteLine(node.Attributes("Temperature").Value)
Next
文档加载,但我根本无法取出数据,因为没有返回任何内容,我在这里缺少什么??
提前致谢
奥兹
更新 2:已在 Visual Studio 中获取完整的 XML 输出并在上面更新
更新 3:已将下面 @CrnaStena 中的示例与上述 XML 一起使用,但仍然没有返回任何值
【问题讨论】:
-
您似乎选择了没有温度属性的 ROMid 节点。您必须先获取节点父节点,然后查找名称为 temperature 的子节点。
-
我已尝试选择根节点“/Devices-Detail-Response”,但这不会返回任何内容。这就是我以古老的经典 asp 方式做到的:
Dim strXPath : strXPath = "/Devices-Detail-Response/owd_DS18B20[ROMId='" & strName & "']" Dim xmlSensor For Each xmlSensor In objXML.documentElement.selectNodes(strXPath) Dim romID : romID = xmlSensor.selectSingleNode("ROMId").text Dim temperature : temperature = xmlSensor.selectSingleNode("Temperature").text Response.Write Server.HTMLEncode(temperature) & "<br /><br />" Next -
如果我在 Visual Studio 中单步执行代码,我可以看到文档正在成功加载,但是当我们通过它时,数据/节点不可用
-
我终于到了电脑前,看看我的回答,如果您需要进一步的帮助,请告诉我。
-
为什么你的 XML 没有使用命名空间前缀?示例 XML 中的所有节点都在默认命名空间中。