来自REST Web服务的Linq2Xml Parse输出

时间:2011-01-03 12:41:08

标签: asp.net linq-to-xml

我正在尝试解析REST Web服务的XML输出,并指出了使用Linq2Xml查询XML以获取我所追求的属性的方向。 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>

我想在一个数据表中返回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") = result.@name
            .Item("value") = result.Value
        End With
    Next
    Return dt
End Function

返回的数据表为空,我已确认结果确实已分配XML,而result.value是XML文件的字符串版本(200Westralia0 {81C56183-31DA-45C2-90C3-81609F01B38B} Lounge10001 {eac0109e-0090 -a992-7fba-dc67fe29e6e7})

是否有人能够提供有关我如何从名称(ZoneName%)和属性值(Westralia和Lounge)上方的REST XML示例中读取的帮助?

1 个答案:

答案 0 :(得分: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

获取Items而不是Response。

此外,您还需要添加

    dt.Rows.Add(dr)

到你的循环,否则你的新行不会被添加到DataTable。

最后,XML区分大小写,因此您需要使用@Name,而不是@name