Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPath未返回节点值ASP.NET 4.5_Asp.net_Xml_Vb.net_Xpath - Fatal编程技术网

XPath未返回节点值ASP.NET 4.5

XPath未返回节点值ASP.NET 4.5,asp.net,xml,vb.net,xpath,Asp.net,Xml,Vb.net,Xpath,这里有一个小问题,我正在为客户将传统的经典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.embeddeddatasystem

这里有一个小问题,我正在为客户将传统的经典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>
文档已加载,但我无法获取数据,因为没有返回任何内容,我在这里遗漏了什么

提前谢谢

奥齐

更新2:在Visual Studio中获取了完整的XML输出,并在上面进行了更新


更新3:已将下面@CrnaStena中的示例与上述XML一起使用,但仍然没有返回任何值

,因此这里是我在C#中的LinqPad示例,很抱歉,我已经20年没有使用VB了。我已经扩展了您的XML,添加了具有不同ROMid和温度的额外节点

void Main()
{
        // XML to load
    var xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<Devices-Detail-Response>
    <PollCount>36593</PollCount>
    <DevicesConnected>2</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>61014B467FFF0F1002FF</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>
    <owd_DS18B20 Description=""Programmable resolution thermometer"">
        <Name>DS18B20</Name>
        <Family>28</Family>
        <ROMId>2D0000023C519A29</ROMId>
        <Health>7</Health>
        <RawData>61014B467FFF0F1002FF</RawData>
        <PrimaryValue>22.0625 Deg C</PrimaryValue>
        <Temperature Units=""Centigrade"">24.0625</Temperature>
        <UserByte1 Writable=""True"">75</UserByte1>
        <UserByte2 Writable=""True"">70</UserByte2>
        <Resolution>12</Resolution>
        <PowerSource>255</PowerSource>
    </owd_DS18B20>  
</Devices-Detail-Response>";

    var xmlDoc = new XmlDocument();
    xmlDoc.LoadXml(xml);

    var nodes = xmlDoc.SelectNodes("//owd_DS18B20/ROMId[text()='2D0000023C519A28']/../Temperature");
    foreach(XmlNode node in nodes)
    {
        node.InnerText.Dump();
    }


}
更新2-这很有效。您的XML缺少
的结束标记。您还必须为XPath中的每个标记指定名称空间

 //opsm_ns:owd_DS18B20/opsm_ns:ROMId[text()='" & deviceId & "']/../opsm_ns:Temperature
这是整个迷你节目

Sub Main
    Dim xml As String
    Dim m_xmld As XmlDocument

    xml = <![CDATA[<?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>]]>.Value

    m_xmld = New XmlDocument()
    m_xmld.LoadXml(xml)
    Dim m_xmlns As New XmlNamespaceManager(m_xmld.NameTable)
    m_xmlns.AddNamespace("opsm_ns", "http://www.embeddeddatasystems.com/schema/owserver")
    Dim deviceId As String = "2D0000023C519A28"

    For Each node As XmlNode In m_xmld.SelectNodes("//opsm_ns:owd_DS18B20/opsm_ns:ROMId[text()='" & deviceId & "']/../opsm_ns:Temperature", m_xmlns)
        node.InnerText.Dump()
    Next

End Sub
Sub-Main
将xml设置为字符串
Dim m_xmld作为XmlDocument
xml=
150722
4.
3.974
2.
OWU服务器网络
EDSOWSERVER
00:50:C2:91:B3:9C
DS18B20
28
2D000023C519A28
7.
0E014B467FFF021000000
16.8750摄氏度
16.8750
75
70
12
0
DS18B20
28
DA000002E0E5A928
7.
32014B467FFF0E101E000000
19.1250摄氏度
19.1250
75
70
12
0
DS18B20
28
C3000002E0EE1B28
7.
1D014B467FFF0310C5000000
17.8125摄氏度
17.8125
75
70
12
0
DS18B20
28
070000023DBB7F28
7.
52014B467FFF0E10FFFF0000000000000000
21.1250摄氏度
21.1250
75
70
12
255
]]>.价值
m_xmld=新的XmlDocument()
m_xmld.LoadXml(xml)
Dim m_xmlns成为新的XmlNamespaceManager(m_xmld.NameTable)
添加名称空间(“opsm”http://www.embeddeddatasystems.com/schema/owserver")
尺寸标注设备ID为String=“2D000023C519A28”
将每个节点作为m_xmld中的XmlNode。选择节点(//opsm_ns:owd_DS18B20/opsm_ns:ROMId[text()='“&deviceId&']/../opsm_ns:Temperature”,m_xmlns)
node.InnerText.Dump()
下一个
端接头

您的XML位于默认命名空间中,但您正在尝试读取指定命名空间中的节点。更改此项:

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
为此:

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("//owd_DS18B20[ROMId='" & deviceId & "']") /*,m_xmlns)*/
Console.WriteLine(node.Attributes("Temperature").Value)
Next
或者,使用命名空间中的新更新(但与实际使用的不同,您可以这样做):

如果您的XML在某些实例中确实包含名称空间,但在其他实例中不包含名称空间,但您知道您总是希望按名称使用该节点,那么您可以像这样使用
local-name()
函数:

m_xmld.SelectNodes("//*[local-name()='owd_DS18B20'][ROMId='" & deviceId & "']")

您似乎正在选择没有温度属性的ROMid节点。您必须获取节点父节点,然后查找名为temperature的子节点。我已尝试在根节点“/Devices Detail Response”中选择,但这不会返回任何结果。这就是我用传统的asp方式所做的:
Dim-strXPath:strXPath=“/Devices-Detail-Response/owd_DS18B20[ROMId='”&strName&“]”Dim-xmlSensor为objXML.documentElement.selectNodes(strXPath)Dim-ROMId=xmlSensor.selectSingleNode(“ROMId”)中的每个xmlSensor创建Dim-xmlSensor.text Dim temperature:temperature=xmlSensor.selectSingleNode(“温度”).text Response.Write Server.HTMLEncode(温度)和“

”下一步
如果我在visual studio中单步查看代码,我可以看到文档正在成功加载,但当我们在其中移动时,数据/节点不可用。我最终到达计算机,请查看我的答案并告诉我是否需要进一步帮助。为什么在XML不可用的情况下使用名称空间前缀?示例XML中的所有节点都在默认名称空间中。哈,在我的示例中,我还禁用了名称空间,但我不知道本地名称。每天学习新的东西。谢谢。我在你的书中错过了——我不太确定你有什么changed@DanField我试过你的建议,一旦我们点击for-each循环,它就会退出,因为节点as-xmlnode是空的??我确实试过你的其他建议,但这没什么区别。我真的不明白,因为连接到xml源没有问题。更新了我的答案。您的实际XML实例使用了一个新的名称空间。@DanField,更改成功了,但我必须根据CrnaStena的更新更改selectnodes路径,并将node.attributes(“”.values)更改为node.innerText以返回值。感谢您的帮助,以前从未使用过XML名称空间,所以在这里学到了一些新东西:-)我尝试了您的建议,但很不幸,正如dan field的建议一样,我没有得到任何结果。我将在稍后发布innerXML的完整XML输出,以防我们丢失某些内容。好的,使用更新1中的完整XML(我已在上面更新)发送您的电子邮件,是的,不返回值。我更改了Select NOTES行以包含根目录的完整路径,但仍然没有任何内容:-(很抱歉,我在上面的评论中指的是示例而不是电子邮件。好的,我添加了适用于名称空间的示例。请参阅更新2。工作正常,但必须删除.Dump(),因为它不受支持,对XML名称空间的新增功能非常有帮助,再次感谢:-)
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("//owd_DS18B20[ROMId='" & deviceId & "']") /*,m_xmlns)*/
Console.WriteLine(node.Attributes("Temperature").Value)
Next
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://www.embeddeddatasystems.com/schema/owserver")

For Each node As XmlNode In
m_xmld.SelectNodes("//opsm_ns:owd_DS18B20[ROMId='" & deviceId & "']",m_xmlns)
Console.WriteLine(node.Attributes("Temperature").Value)
Next
m_xmld.SelectNodes("//*[local-name()='owd_DS18B20'][ROMId='" & deviceId & "']")