Solarwinds API节点选择返回0条数据问题求助
问题分析与解决方案
咱们先拆解你遇到的两个核心问题:SelectNodes返回0条节点,以及代码逻辑判断的小问题,结合你怀疑的编码问题逐一解决。
1. 编码不匹配:XML解析的隐性坑
你的XML声明明确标注了ISO-8859-1编码,但如果AppShared.LoadXMLDocument方法默认用UTF-8加载内容,就会出现编码不匹配,导致XML解析时出现隐性错误,最终节点无法被正确识别(这大概率是节点数为0的核心原因)。
修复方案:明确指定编码加载XML
替换原有的加载逻辑,手动指定编码为ISO-8859-1来获取并解析XML:
Dim myFeed As New XmlDocument() Using webClient As New WebClient() ' 强制匹配XML声明的ISO-8859-1编码 webClient.Encoding = Encoding.GetEncoding("ISO-8859-1") Dim xmlContent As String = webClient.DownloadString(feedURL) myFeed.LoadXml(xmlContent) End Using
2. 代码逻辑的两个细节问题
(1)XmlNodeList永远不会为Nothing
你用If Not IsNothing(myFeed.SelectNodes("//client")) Then的判断是无效的——SelectNodes哪怕没匹配到任何节点,也会返回一个Count为0的XmlNodeList,永远不会是Nothing。这就是为什么你总是看到"Has 0 items"而不是"No Client Nodes"。
正确的判断应该直接检查节点数量:
myXMLNodeList = myFeed.SelectNodes("//client") If myXMLNodeList.Count > 0 Then Console.WriteLine("Has " & myXMLNodeList.Count & " items") ' 后续节点处理逻辑 Else Console.WriteLine("No Client Nodes.") End If
(2)XML大小写敏感+相对路径错误
你的XML里的节点是<clientid>(全小写),但代码里写的是SelectSingleNode("//clientID")(大小写混合)——XML是严格区分大小写的,这会导致后续获取节点值失败。另外,循环里用//client是全局搜索,应该用相对当前节点的路径:
修改循环内的代码:
For Each currentXMLNode As XmlNode In myXMLNodeList Console.WriteLine("Processing row...") ' 用相对路径找当前client节点下的clientid,注意大小写完全匹配 rmmClientID = Integer.Parse(currentXMLNode.SelectSingleNode("clientid").Value) Console.WriteLine("ClientID: " & rmmClientID) ' 其他字段同理:比如workstation_count对应XML里的<workstation_count> workstationCount = Integer.Parse(currentXMLNode.SelectSingleNode("workstation_count").Value) Next
总结修复顺序
- 先解决编码问题,确保XML被正确解析;
- 调整节点存在性的判断逻辑;
- 修正XML节点的大小写匹配问题,使用相对路径获取子节点。
按这个顺序修改后,应该就能正常获取到client节点了。
内容的提问来源于stack exchange,提问作者David Arnold
相关产品推荐
相关产品推荐

