Выбор узлов из XML возвращает 0 элементов - PullRequest
0 голосов
/ 19 апреля 2020

Я работаю с нашим API-интерфейсом Solarwinds, и мой код выбирает узлы, но возвращает ноль. Если я извлекаю из другого источника, код корректно вытягивает узлы. Есть ли что-то в фиде, который мне нужно учитывать? Единственное отличие, которое я вижу, - это кодировка.

Вот фрагмент кода XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<result created="2020-04-18T15:06:26-05:00" host="www.systemmonitor.us" status="OK">
    <items>
        <client>
            <name>
                <![CDATA[Best Client]]>
            </name>
            <clientid>111111</clientid>
            <view_dashboard>0</view_dashboard>
            <view_wkstsn_assets>0</view_wkstsn_assets>
            <dashboard_username>
                <![CDATA[none]]>
            </dashboard_username>
            <timezone></timezone>
            <creation_date>2019-07-02</creation_date>
            <server_count>0</server_count>
            <workstation_count>2</workstation_count>
            <mobile_device_count>0</mobile_device_count>
            <device_count>2</device_count>
        </client>
</items>
</result>

А вот фрагмент кода VB. net:

        Dim myFeed As XmlDocument = AppShared.LoadXMLDocument(feedURL)
        Dim myXMLNodeList As XmlNodeList
        Dim xmlNode as XmlNode

        Console.WriteLine("Connected")

        '---select all of the clients in the feed
        If Not IsNothing(myFeed.SelectNodes("//client")) Then

            dim rmmClientID as Integer = 0
            dim clientName as string = 0
            dim serverCount as Integer = 0
            Dim workstationCount as Integer = 0
            dim mobileDeviceCount as Integer = 0
            dim deviceCount as Integer = 0

            myXMLNodeList = myFeed.SelectNodes("//client")
            Console.WriteLine("Has " & myXMLNodeList.Count & " items")
            For Each currentXMLNode As XmlNode In myXMLNodeList

                Console.WriteLine("Processing row...")
                rmmClientID = currentXMLNode.SelectSingleNode("//client").SelectSingleNode("//clientID").Value
                Console.WriteLine("ClientID: " & rmmClientID)


            Next


        Else
            Console.WriteLine("No Client Nodes.")
        End If

Это не говорит "Нет клиентских узлов", это говорит "имеет 0 пунктов". Я попытался выбрать // элементы, а также // элементы / клиента. Тот же результат.

Ответы [ 3 ]

0 голосов
/ 19 апреля 2020

Использование xml linq:

Imports System.Xml
Imports System.Xml.Linq
Module Module1
    Const FILENAME As String = "c:\temp\test.xml"
    Sub Main()
        Dim doc As XDocument = XDocument.Load(FILENAME)

        Dim clients As List(Of Client) = doc.Descendants("client").Select(Function(x) New Client() With { _
            .name = CType(x.Element("name"), String),
            .id = CType(x.Element("clientid"), Integer),
            .dashboard = CType(x.Element("view_dashboard"), Integer),
            .asset = CType(x.Element("view_wkstsn_assets"), Integer),
            .username = CType(x.Element("dashboard_username"), String),
            .timezone = CType(x.Element("timezone"), String),
            .creationDate = CType(x.Element("creation_date"), DateTime),
            .serverCount = CType(x.Element("server_count"), Integer),
            .workstationCount = CType(x.Element("workstation_count"), Integer),
            .mobileDeviceCount = CType(x.Element("mobile_device_count"), Integer),
            .deviceCount = CType(x.Element("device_count"), Integer)
        }).ToList()
    End Sub

End Module
Public Class Client
    Public Property name As String
    Public id As Integer
    Public dashboard As Integer
    Public asset As Integer
    Public username As String
    Public timezone As String
    Public creationDate As DateTime
    Public serverCount As Integer
    Public workstationCount As Integer
    Public mobileDeviceCount As Integer
    Public deviceCount As Integer
End Class
0 голосов
/ 19 апреля 2020

Вы были очень близки. Пара изменений.

Во-первых, SelectNodes возвращает объект коллекции узлов со счетчиком = 0, если ничего не найдено (не ноль)

Во-вторых, не повторяйте запрос // клиента снова и снова , Получите список один раз и используйте его по мере необходимости.

Наконец, в вашем foreach l oop ваша переменная currentXMLNode уже указывает на клиент, поэтому xpath selectSingleNode относятся к клиенту, нет необходимости снова сканируйте документ.

Вот рабочий пример.

Dim myXMLNodeList As XmlNodeList
                Dim xmlNode As XmlNode

                Console.WriteLine("Connected")

                ' Keep the node list around
                myXMLNodeList = myFeed.SelectNodes("//client")

                If myXMLNodeList.Count > 0 Then
                        Dim rmmClientID As Integer = 0
                        Dim clientName As String = 0
                        Dim serverCount As Integer = 0
                        Dim workstationCount As Integer = 0
                        Dim mobileDeviceCount As Integer = 0
                        Dim deviceCount As Integer = 0

                        Console.WriteLine("Has " & myXMLNodeList.Count & " items")
                        For Each currentXMLNode As XmlNode In myXMLNodeList
                                Console.WriteLine("Processing row...")

                                ' Fixed element name clientID
                                rmmClientID = currentXMLNode("clientid").Value
                                Console.WriteLine("ClientID: " & rmmClientID)
                        Next
                Else
                        Console.WriteLine("No Client Nodes.")
                End If
0 голосов
/ 19 апреля 2020

myFeed.SelectNodes ("// client") не будет Nothing (или null), но пустой XmlNodeList

проверяет вывод

Console.Writeline (myFeed.Outer Xml)

содержат ли данные узел

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...