Разобрать REST XML файл - PullRequest
       4

Разобрать REST XML файл

0 голосов
/ 02 января 2011

Я работаю над приложением .NET 3.5 Windows Forms, которое будет взаимодействовать с веб-службой REST, которая выводит XML-файл, например:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Response Status="OK">
<Item Name="NumberZones">2</Item>
<Item Name="CurrentZoneID">10001</Item>
<Item Name="CurrentZoneIndex">1</Item>
<Item Name="ZoneName0">Westralia</Item>
<Item Name="ZoneID0">0</Item>
<Item Name="ZoneGUID0">{81C56183-31DA-45C2-90C3-81609F01B38B}</Item>
<Item Name="ZoneName1">Lounge</Item>
<Item Name="ZoneID1">10001</Item>
<Item Name="ZoneGUID1">{eac0109e-0090-a992-7fba-dc67fe29e6e7}</Item>
</Response>

Мне нужна помощь, как мне разобрать этот файл, чтобы я мог получить значение имени элемента (например, ZoneName0) и значение атрибута (в данном случае Westralia).

Я играл с использованием xDocument для синтаксического анализа XML-документа и смог это сделать, однако он очень медленный, что мне кажется, потому что я перебираю XML-документ и пытаюсь сопоставить имя элемента: *

Public Function getZoneDetails(ByVal serverName As String, ByVal serverPort As String) As DataTable
        Dim sResult As DataTable
        sResult = New DataTable("ZoneDetails")
        With sResult
            .Columns.Add("column")
            .Columns.Add("data")
            .Columns.Add("zoneID")
            .Columns.Add("result")
        End With
        xmlDocPath = "temp.xml"
        If Not DownloadXml(serverName, serverPort, "Playback/Zones", xmlDocPath) Then
            Dim fDtRow As DataRow = sResult.NewRow()
            fDtRow.Item(0) = ""
            fDtRow.Item(1) = ""
            fDtRow.Item(2) = ""
            fDtRow.Item(3) = "Error downloading XML"
            sResult.Rows.Add(fDtRow)
            Return sResult
        End If
        If Not LoadXml(xmlDocPath) Then
            Dim fDtRow As DataRow = sResult.NewRow()
            fDtRow.Item(0) = ""
            fDtRow.Item(1) = ""
            fDtRow.Item(2) = ""
            fDtRow.Item(3) = "Error loading XML internally"
            sResult.Rows.Add(fDtRow)
            Return sResult
        End If
        Try
            ' Make sure <status> = OK
            Dim status As String = xdoc.Root.Attribute("Status").Value
            If status <> "OK" Then
                Dim fDtRow As DataRow = sResult.NewRow()
                fDtRow.Item(0) = ""
                fDtRow.Item(1) = ""
                fDtRow.Item(2) = ""
                fDtRow.Item(3) = "No route can be mapped out"
                sResult.Rows.Add(fDtRow)
                Return sResult
            End If

            Dim zoneID As String = String.Empty
            Dim i As Integer = 0
            For Each obj In xdoc.Root.Elements("Item").Attributes("Name")
                Dim nRow As DataRow = sResult.NewRow()
                If obj.Value = "ZoneID" + i.ToString Then
                    zoneID = obj.Parent.Value
                    nRow.Item(0) = "ZoneID"
                    nRow.Item(1) = zoneID
                    nRow.Item(2) = zoneID
                    nRow.Item(3) = "OK"
                End If

                If obj.Value = "ZoneName" + i.ToString Then
                    nRow.Item(0) = "ZoneName"
                    nRow.Item(1) = obj.Parent.Value
                    nRow.Item(2) = zoneID
                    nRow.Item(3) = "OK"
                End If

                If obj.Value = "ZoneGUID" + i.ToString Then
                    nRow.Item(0) = "ZoneGUID"
                    nRow.Item(1) = obj.Parent.Value
                    nRow.Item(2) = zoneID
                    nRow.Item(3) = "OK"
                End If
                i = i + 1
                sResult.Rows.Add(nRow)
            Next
            Return sResult
        Catch ex As Exception
            Dim fDtRow As DataRow = sResult.NewRow()
            fDtRow.Item(0) = ""
            fDtRow.Item(1) = ""
            fDtRow.Item(2) = ""
            fDtRow.Item(3) = "Error occured"
            sResult.Rows.Add(fDtRow)
            Return sResult
        End Try
    End Function

Я хочу прочитать XML, назначить атрибуты и имена атрибутов в набор данных, который будет связан с выпадающим списком.

Может кто-нибудь посоветовать, если есть лучший метод, делающий то, чего я хочу достичь? Я стремлюсь к лучшему решению.

Если есть какие-либо вопросы, пожалуйста, не стесняйтесь, дайте мне знать.

Ответы [ 2 ]

1 голос
/ 02 января 2011

Если вы хотите улучшить производительность, я бы рассмотрел несколько вещей:

1 - Прекратить загрузку XML в файл на диске и затем загрузить файл в XML. Используя HttpWebRequest или HttpClient, вы можете извлечь данные в виде потока и затем загрузить этот поток непосредственно в объект XElement / XDocument.

2 - Вместо загрузки в DataTable я бы использовал Linq2Xml для запроса по документу и создания коллекции объектов.

0 голосов
/ 02 января 2011

В прошлом я успешно использовал Json.NET для анализа результатов вызовов Google Translation API или Twitter API.

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