1

Once again having issues parsing XML. I've got almost all of it figured out but am stuck where I have multiple nodes with the same name. Here's a snippet from the XML

<HotelDetailsRsp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" TraceId="0.7055475" TransactionId="72CEA41F0A0758AA26AA4A14D780FC06" ResponseTime="1069">
  <RequestedHotelDetails xmlns="http://www.travelport.com/schema/hotel_v19_0">
    <HotelProperty HotelChain="LC" HotelCode="14645" HotelLocation="BOM" Name="ITC GRAND CENTRAL MUMBAI">
      <PropertyAddress>
        <Address>Dr Babasaheb Ambedkar Road</Address>
        <Address>Mumbai 400012 IN</Address>
        <Address>Parel</Address>
      </PropertyAddress>
      <PhoneNumber xmlns="http://www.travelport.com/schema/common_v17_0" Type="Business" Number="91 22-24101010"/>
      <PhoneNumber xmlns="http://www.travelport.com/schema/common_v17_0" Type="Fax" Number="91 22-24101111"/>
      <Distance xmlns="http://www.travelport.com/schema/common_v17_0" Value="6" Direction="S"/>
    </HotelProperty>
  </RequestedHotelDetails>
</HotelDetailsRsp>

And this is the VB.NET code I'm using to parse it with

For Each n As XElement In _xDoc.Descendants(_ns + "HotelProperty")
    _hotelProperty.Add(New HotelProperty With { _
                   .HotelChain = n.Attribute("HotelChain").Value, _
                   .HotelCode = n.Attribute("HotelCode").Value, _
                  .HotelLocation = n.Attribute("HotelLocation").Value, _
                  .HotelName = n.Attribute("Name").Value, _
                  .Address = n.Descendants(_ns + "PropertyAddress").Select(Function(el As String) el).ToList(), _
                  .PhoneNumber = n.Descendants(_ns + "PhoneNumber").Where(Function(e) e.Attribute("Type") = "Bunsiness").Value, _
                  .FaxNumber = n.Descendants(_ns + "PhoneNumber").Where(Function(e) e.Attribute("Type") = "Fax").Value})
Next

All values are populated when I test it except PhoneNumber and FaxNumber. How would I go about accomplishing this? Thanks

MarcinJuraszek
  • 124,003
  • 15
  • 196
  • 263
PsychoCoder
  • 10,570
  • 12
  • 44
  • 60

2 Answers2

2

Two things which are immediately obvious to me:

Function(e) e.Attribute("Type") = "Bunsiness"

should be

Function(e) e.Attribute("Type") = "Business"

And _ns + "PhoneNumber" should be _ns17 + "PhoneNumber", where _ns17 points to the namespace http://www.travelport.com/schema/common_v17_0 instead of http://www.travelport.com/schema/hotel_v19_0

Thomas Weller
  • 55,411
  • 20
  • 125
  • 222
  • Made those changes and it went from returning Nothing to returning empty strings for the phone & fax numbers. Something tells me it's in the Function(e) e.Attribute = "Business" part but I cant quite put my finger on it – PsychoCoder Feb 17 '14 at 01:32
1
  1. PhoneNumber elements have difference namespace

    Dim _ns2 = XNamespace.Get("http://www.travelport.com/schema/common_v17_0")
    
  2. The number your looking for is not the value of element, it's stored in Number attribute

    .PhoneNumber = n.Descendants(_ns2 + "PhoneNumber").First(Function(e) e.Attribute("Type") = "Business").Attribute("Number").Value, _
    .FaxNumber = n.Descendants(_ns2 + "PhoneNumber").First(Function(e) e.Attribute("Type") = "Fax").Attribute("Number").Value
    
MarcinJuraszek
  • 124,003
  • 15
  • 196
  • 263