-1

这里有一个小问题,我正在为客户开发一个传统的 Classic ASP 应用程序,并且需要从 XML 文件中提取数据,但我无法获取单个节点的值,我的代码什么也不返回。

我已经并且能够毫无问题地从 XML 文件中提取所有数据。

XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<Devices-Detail-Response>
   <PollCount>36593</PollCount>
   <DevicesConnected>1</DevicesConnected>
   <LoopTime>1.031</LoopTime>
   <DataErrors>0</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>61014B467FFF0F1002FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</RawData>
      <PrimaryValue>22.0625 Deg C</PrimaryValue>
      <Temperature Units="Centigrade">22.0625</Temperature>
      <UserByte1 Writable="True">75</UserByte1>
      <UserByte2 Writable="True">70</UserByte2>
      <Resolution>12</Resolution>
      <PowerSource>255</PowerSource>
   </owd_DS18B20>
</Devices-Detail-Response>

xml-text.asp 文件

<%
Option Explicit 
Response.Write GetTemperature("http://192.168.1.85/details.xml", "2D0000023C519A28")
Function GetTemperature(strXMLFile, strName)

Dim objXML : Set objXML = CreateObject("Msxml2.DOMDocument.6.0")
objXML.async = False
objXML.SetProperty "SelectionLanguage", "XPath"
objXML.SetProperty "ServerHTTPRequest", True
objXML.load(strXMLFile)

''// enclose in single- or double quotes accordingly
If InStr(strName, "'") > 0 And InStr(strName, """") = 0 Then
    strName = """" & strName & """"
    ElseIf InStr(strName, "'") = 0 And InStr(strName, """") > 0 Then
        strName = "'" & strName & "'"
    Else
        ''// both single and double quotes in a string are unsupported
        strName = "''"  
End If

Dim strXPath : strXPath = "/Devices-Detail-Response/owd_DS18B20[ROMId=" & strName & "]/Temperature"
Dim objNode : Set objNode = objXML.documentElement.selectSingleNode(strXPath)

If Not objNode Is Nothing Then
    value = objNode.text
End If
End Function 
%>

简单地什么也不返回,value = objNode.text如果我沿着 XPath 向后移动,我仍然什么也得不到。

已经很晚了,我知道我错过了一些简单的东西?!?

干杯,

奥齐

更新:如果我执行以下操作,请在此处进行一些更新:

Dim xmlSensor 
For Each xmlSensor In objXML.documentElement.selectNodes("owd_DS18B20") 
Dim romID : romID = xmlSensor.selectSingleNode("ROMId").text 
Dim temperature : temperature = xmlSensor.selectSingleNode("Temperature").text
Response.Write Server.HTMLEncode(romID) & "<br />"
Response.Write Server.HTMLEncode(temperature) & "<br /><br />"
Next

我得到了所需的值,问题是最多可以链接 24 个传感器,并且 ROMId 是唯一标识符,所以我们确实需要对此进行过滤,所以问题必须与我认为的 XPATH 字符串有关。

4

2 回答 2

1

鉴于上面@SearchAndResQ 给出的指针,我修改了函数如下:

Function GetTemperature(strXMLFile, strName)

Dim value
Dim objXML : Set objXML = CreateObject("MSXML2.DOMDocument.3.0")
objXML.async = False
objXML.load(strXMLFile)

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(romID) & "<br />"
     Response.Write Server.HTMLEncode(temperature) & "<br /><br />"   
Next      
End Function

请注意,我已删除字符串替换部分并将单引号硬编码到 XPath 字符串中。

现在,即使连接了多个传感器,它也能准确提供所需的数据。:-) 谢谢你们

于 2014-08-17T07:44:58.223 回答
1

我认为您在替换块中缺少一个ElseIf条件。

If InStr(strName, "'") > 0 And InStr(strName, """") = 0 Then
        strName = """" & strName & """"
    ElseIf InStr(strName, "'") = 0 And InStr(strName, """") > 0 Then
        strName = "'" & strName & "'"
    ElseIf InStr(strName, "'") > 0 And  InStr(strName, """") > 0 Then
        ''// both single and double quotes in a string are unsupported
        strName = "''"  
End If
于 2014-08-17T07:06:33.917 回答