使用VB.NET将XML元素解析为List(Of String)

时间:2014-02-11 19:09:53

标签: xml vb.net linq-to-xml

我从Web服务调用返回了一个巨大的XML文件,我正在解析它。我遇到的一个问题是将多个元素(具有相同的名称)解析为List(Of String)。 XML看起来像这样

<BasicPropertyInfo ChainCode="CY" GEOConfidenceLevel="3" HotelCityCode="KWI" HotelCode="0048191" HotelName="COURTYARD KUWAIT CITY MARRIOTT" Latitude="29.377052" Longitude="47.990384" NumFloors="21" RPH="001">
  <Address>
    <AddressLine>AL SHUHADA ST PO BOX 1216 DASM</AddressLine>
    <AddressLine>DASMAN KUWAIT CITY KW 15463</AddressLine>
    <CountryCode>KW</CountryCode>
  </Address>
  <Award Provider="NTM3 CROWN" />
  <ContactNumbers>
    <ContactNumber Phone="965-22997000" Fax="965-22997001" />
  </ContactNumbers>

我的课很简单

Namespace Classes.Models
    Public Class PropertyInfo
        Public Property ChainCode() As String
        Public Property HotelCityCode() As String
        Public Property HotelCode() As String
        Public Property HotelName() As String
        Public Property Address() As IEnumerable(Of String)
        Public Property PhoneNumber() As String
        Public Property FaxNumber() As String
    End Class
End Namespace

在下面的代码中,如果我删除我想要获取 AddressLine 的位置,它会填充该类,只要我添加代码就会突然出现错误

  

无法投射类型的对象   'd__14 2[System.Xml.Linq.XElement,System.Char]' to type 'System.Collections.Generic.IEnumerable 1 [System.String]'。

Public Function ParsePropertyInfo() As IEnumerable(Of PropertyInfo)
    Try
        Dim ns As XNamespace = "http://webservices.sabre.com/sabreXML/2003/07"
        Dim prop As PropertyInfo

        For Each n As XElement In _xDoc.Descendants(ns + "BasicPropertyInfo")
            _properties.Add(New PropertyInfo With { _
                             .ChainCode = n.Attribute("ChainCode").Value, _
                             .HotelCityCode = n.Attribute("HotelCityCode").Value, _
                             .HotelCode = n.Attribute("HotelCode").Value, _
                             .HotelName = n.Attribute("HotelName").Value,
                             .PhoneNumber = n.Element(ns + "ContactNumbers").Element(ns + "ContactNumber").Attribute("Phone").Value, _
                              .Address = n.Descendants(ns + "AddressLine").SelectMany(Function(el As String) el), _
                             .FaxNumber = n.Element(ns + "ContactNumbers").Element(ns + "ContactNumber").Attribute("Fax").Value})


        Next

        Return _properties
    Catch ex As Exception
        ErrorMessage = ex.Message
        Return Nothing
    End Try
End Function

那么我如何将 AddressLine 元素添加到我的通用列表中呢?

1 个答案:

答案 0 :(得分:2)

使用Select代替SelectMany

.Address = n.Descendants(ns + "AddressLine").Select(Function(el As String) el)

SelectMany查看您的IEnumerable(Of XElement),将每个XElement转换为string,然后将这些字符串中的所有字符合并为一个char的大集合。那是因为string实现了IEnumerable(Of char)

您应该在ToList()之后添加Select调用,以确保只存储string实例的集合,而不是查询定义,每次访问时都会执行财产。