Parsing XML file with nodes of same name with VB.NET

自古美人都是妖i 提交于 2019-12-11 09:25:46

问题


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


回答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
    



回答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



来源:https://stackoverflow.com/questions/21818972/parsing-xml-file-with-nodes-of-same-name-with-vb-net

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!