1
votes

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

2

2 Answers

2
votes

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

1
votes
  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