2011-01-03 3 views
0

Я пытаюсь проанализировать вывод XML из веб-службы REST и был направлен в сторону использования Linq2Xml для запроса XML для атрибутов, которые я им предоставляю. Вывод XML выглядит следующим образом:Linq2Xml Parse Output из веб-службы REST

<?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> 

Я хотел вернуться в DataTable ZoneId, ZoneName и ZoneGUID, я хотел функцию, чтобы вернуть что-то вроде:

id name  guid 
0  westralia {81C56183-31DA-45C2-90C3-81609F01B38B} 
10001 lounge  {eac0109e-0090-a992-7fba-dc67fe29e6e7} 

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

Private Function getServerResponse_Linq(ByVal queryString As Uri) As DataTable 
    Dim dt As DataTable = New DataTable("data") 
    With dt 
     .Columns.Add("name") 
     .Columns.Add("Value") 
    End With 
    Dim loaded As XDocument = XDocument.Load(queryString.ToString) 
    Dim dr As DataRow 
    Dim query = From c In loaded.<Response> Select c 
    For Each result In query 
     dr = dt.NewRow 
     With dr 
      .Item("name") = [email protected] 
      .Item("value") = result.Value 
     End With 
    Next 
    Return dt 
End Function 

Возвращенный DataTable пуст, я подтвердил, что результат действительно есть XML назначены, и result.value является строка версии файла XML (200Westralia0 {81C56183-31DA-45C2-90C3-81609F01B38B} Lounge10001 {eac0109e-0090-a992-7fba-dc67fe29e6e7})

Может ли кто-нибудь помочь в том, как я могу читать из примера REST XML над именем (ZoneName%) и значением атрибута (Westralia и Lounge)?

ответ

1

Есть три проблемы, которые я вижу с помощью вашего фрагмента кода. Во-первых, вместо

Dim query = From c In loaded.<Response> Select c 

вам нужно

Dim query = From c In loaded.<Response>.Elements Select c 

или даже просто

Dim query = loaded.<Response>.Elements 

для извлечения детали, а не ответ.

Кроме того, вам нужно добавить

dt.Rows.Add(dr) 

к вашей петле, в противном случае новая строка не добавляется в DataTable.

И, наконец, XML чувствителен к регистру, поэтому вам необходимо использовать @Name, а не @name.

+0

Отлично! это всегда простые вещи (хорошо, если вы знаете их, что есть). Эти изменения работали отлично, если бы я мог потребовать обратно последние 3 часа. – Lima