Xml XPath未返回节点值
这里有一个小问题,我正在为客户开发一个遗留的经典ASP应用程序,需要从XML文件中提取数据,但我无法获得单个节点的值,我的代码只返回一个值 我已经并且能够毫无问题地从XML文件中提取所有数据 XML文件Xml XPath未返回节点值,xml,xpath,asp-classic,msxml,msxml6,Xml,Xpath,Asp Classic,Msxml,Msxml6,这里有一个小问题,我正在为客户开发一个遗留的经典ASP应用程序,需要从XML文件中提取数据,但我无法获得单个节点的值,我的代码只返回一个值 我已经并且能够毫无问题地从XML文件中提取所有数据 XML文件 <?xml version="1.0" encoding="UTF-8"?> <Devices-Detail-Response> <PollCount>36593</PollCount> <DevicesConnected>
<?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>
我得到了所需的值,问题是最多可能有24个传感器链接,ROMId是唯一标识符,因此我们确实需要对此进行筛选,因此我认为问题一定与XPATH字符串有关。我认为您在替换块中缺少了一个
ElseIf
条件。
给定@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
函数GetTemperature(strXMLFile,strName)
模糊值
Dim objXML:Set objXML=CreateObject(“MSXML2.DOMDocument.3.0”)
objXML.async=False
load(strXMLFile)
Dim strXPath:strXPath=“/Devices Detail Response/owd_DS18B20[ROMId=”&strName&“]”
Dim传感器
对于objXML.documentElement.selectNodes(strXPath)中的每个xmlSensor
Dim romID:romID=xmlSensor.selectSingleNode(“romID”).text
变暗温度:温度=xmlSensor。选择单节点(“温度”)。文本
Response.Write Server.HTMLEncode(romID)和“” Response.Write Server.HTMLEncode(温度)和“
” 下一个 端函数 注意,我已经删除了字符串替换部分,并将单引号硬编码到XPath字符串中
现在,即使连接了多个传感器,也能准确地提供所需的数据。:-)谢谢大家@har07节点没有
InnerText
属性,您对objNode.Value
的想法是什么。“如果我沿着XPath返回,我仍然什么也得不到”是什么意思?长方体不是什么,对吗?但您的意思是,例如XPath/Devices Detail响应
返回一个非空的objNode,其.text属性不返回任何内容?@LankymartobjNode.Value
也不返回任何内容,虽然我并没有说这是错的:-)@LarsH我的意思是,如果我删除XPath字符串的后面部分并向后工作,我会期望从树的更高层返回一些东西??如果我将response.write(objXML.xml)
直接放在objXML.load(strXMLFile)
之后,我会得到xml文件的完整输出,因此我知道我们正在读取和加载该文件,所以我猜问题一定在于XPath字符串或objNode部分,但我无法确定在哪里,因为我觉得这看起来很正常:-(不确定为什么否决:-(嗯,不确定似乎要做的只是将“2D000023C519A28”字符串一分为二,不确定问题出在哪里。您的最后一个Else
,在没有条件的情况下,将'
分配给所有没有'
或“
你是对的,基于此,我修正了问题,谢谢。@如果是这样的话,请接受这个作为答案。请参阅.Lankymart@SearchAndResQ answer Accepted:-)
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
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
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