У меня есть входящий поток XML из ответа веб-службы, которая выглядит как такСинтаксический XML с VB.NET с LINQ к XML
<?xml version="1.0" encoding="utf-16"?>
<HotelPropertyDescriptionRS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" TimeStamp="2013-12-30T18:49:36" Version="1.14.1">
<Success xmlns="http://webservices.sabre.com/sabreXML/2003/07" />
<RoomStay xmlns="http://webservices.sabre.com/sabreXML/2003/07">
<RoomRates>
<RoomRate GuaranteeSurchargeRequired="G" IATACharacteristicIdentification="BGGO00" IATAProductIdentification="BLOOMBERG" RPH="001">
<AdditionalInfo>
<CancelPolicy Numeric="06" />
<Commission NonCommission="true">NON COMMISSIONABLE</Commission>
<Text>BLOOMBERG LP, 0.0 KM, INCLUDES BREAKFAST, INTERNET, WIFI, SEE</Text>
<Text>RATE RULES DELUXE ROOM, GUEST ROOM, 1 KING OR 2 TWIN/SINGLE BE</Text>
</AdditionalInfo>
<Rates>
<Rate Amount="66.600" CurrencyCode="KWD">
<AdditionalGuestAmounts>
<AdditionalGuestAmount MaxExtraPersonsAllowed="0">
<Charges ExtraPerson="0" />
</AdditionalGuestAmount>
</AdditionalGuestAmounts>
<HotelTotalPricing Amount="76.590">
<Disclaimer>INCLUDES TAXES AND SURCHARGES</Disclaimer>
<TotalSurcharges Amount="9.990" />
</HotelTotalPricing>
</Rate>
</Rates>
</RoomRate>
....
(там будет много значений RoomRate вернулся. Я создал класс для держать значения мне нужно разобрать из указанных XML, который выглядит так
Namespace Classes.Models
Public Class RoomRate
Public Property Rate() As String
Public Property Surcharge() As String
Public Property TotalPrice() As String
Public Property CurrencyCode() As String
Public Property CancellationPolicy() As String
Public Property Disclaimer() As String
Public Property Text() As List(Of String)
Public Property Commission() As String
Public Property GuaranteeSurchargeRequired() As String
Public Property IATACharacteristicIdentification() As String
Public Property IATAProductIdentification() As String
Public Property RPH() As String
End Class
End Namespace
Теперь я не ищу кого-то, чтобы написать весь код для меня, я еще ищу идеи, на которых было бы наиболее эффективный способ проанализировать это в моем классе. Я могу использовать XPathDocument и XPathNavigation & классы XPathNodeIterator для этого (не на 100% уверены, как они работают), но есть ли лучший способ выполнить эту задачу?
EDIT
Я пришел с этим до сих пор, которые должны получить мне первые атрибуты в RoomRate элемент
Return From el As XElement In _xDoc...<RoomRate>
Select New RoomRate With { _
.GuaranteeSurchargeRequired = el...<RoomRate>[email protected], _
.IATACharacteristicIdentification = el...<RoomRate>[email protected], _
.IATAProductIdentification = el...<RoomRate>[email protected], _
.RPH = el...<RoomRate>[email protected]}
Теперь как бы я пройти, чтобы получить сказать, политику отмены, стоимость номера и другие атрибуты/элементы в этом коде, который я предоставил? Извините за так много вопросов, я действительно хочу научиться этому правильному пути и быть в состоянии сделать это правильно.
EDIT # 2
Я думаю, что я нахожусь на правильном пути здесь:
Return From el As XElement In _xDoc...<RoomRate>
Select New RoomRate With { _
.GuaranteeSurchargeRequired = [email protected], _
.IATACharacteristicIdentification = [email protected], _
.IATAProductIdentification = [email protected], _
.RPH = [email protected], _
.CancellationPolicy = el...<AdditionalInfo>...<CancellationPolicy>[email protected], _
.Commission = el...<AdditionalInfo>...<Commission>[email protected]}
Может кто-то дайте мне знать, если я нахожусь на правильном пути для достижения этого?
EDIT 3
Я изменил код для этого
For Each n As XElement In _xDoc.Elements("RoomRate")
_rates.Add(New RoomRate With { _
.GuaranteeSurchargeRequired = n.Attribute("GuarateeSurchargeRequired").Value, _
.IATACharacteristicIdentification = n.Attribute("IATACharacteristicIdentification").Value, _
.IATAProductIdentification = n.Attribute("IATAProductIdentification").Value, _
.RPH = n.Attribute("RPH")})
Next
И пока я больше не получаю какие-либо ошибки, но я не получаю никаких результатов не дал, а также.
EDIT 4 Я сделал следующие изменения т моего кода, который должен возвращать IEnumerable (Of RoomRate), но она не будет возвращением ничего (это основано на XML фрагменте я написал выше)
Dim rates = From rate In _xDoc.Descendants("RoomRate")
Select New RoomRate With { _
.GuaranteeSurchargeRequired = rate.Attribute("GuaranteeSurchargeRequired").Value, _
.IATACharacteristicIdentification = rate.Attribute("IATACharacteristicIdentification").Value, _
.IATAProductIdentification = rate.Attribute("IATAProductIdentification").Value, _
.RPH = rate.Attribute("RPH").Value}
Похоже, это должно сработать, что я делаю неправильно здесь?
EDIT # 5 @Neolisk Я сделал мои изменения так, как вы предложили, теперь он выглядит так
For Each n As XElement In _xDoc.Descendants("RoomRate")
rate = New RoomRate()
rate.GuaranteeSurchargeRequired = n.Attribute("GuaranteeSurchargeRequired").Value
rate.IATACharacteristicIdentification = n.Attribute("IATACharacteristicIdentification").Value
rate.IATAProductIdentification = n.Attribute("IATAProductIdentification")
_rates.Add(rate)
Next
Return _rates
Но он никогда не переходит в петлю, он идет прямо к Возратиться _rates
EDIT # 6
Хорошо я получил его заселять первые 3 атрибуты RoomRate элемент, как этот
Dim rate As RoomRate
Dim ns As XNamespace = "http://webservices.sabre.com/sabreXML/2003/07"
Dim rate As RoomRate
For Each n As XElement In _xDoc.Descendants(ns + "RoomRate")
rate = New RoomRate()
rate.GuaranteeSurchargeRequired = n.Attribute("GuaranteeSurchargeRequired").Value
rate.IATACharacteristicIdentification = n.Attribute("IATACharacteristicIdentification").Value
rate.IATAProductIdentification = n.Attribute("IATAProductIdentification").Value
rate.RPH = n.Attribute("RPH").Value
_rates.Add(rate)
Next
Теперь, когда я пытаюсь пройти через остальную часть документа, я стараюсь и получить значение CancelPolicy как так
Dim rate As RoomRate
Dim ns As XNamespace = "http://webservices.sabre.com/sabreXML/2003/07"
Dim rate As RoomRate
For Each n As XElement In _xDoc.Descendants(ns + "RoomRate")
rate = New RoomRate()
rate.GuaranteeSurchargeRequired = n.Attribute("GuaranteeSurchargeRequired").Value
rate.IATACharacteristicIdentification = n.Attribute("IATACharacteristicIdentification").Value
rate.IATAProductIdentification = n.Attribute("IATAProductIdentification").Value
rate.RPH = n.Attribute("RPH").Value
rate.CancellationPolicy = n.Element("AdditionalInfo").Element("CancelPolicy").Attribute("Numeric").Value
_rates.Add(rate)
Next
Но добавив, что последняя строка вызывает NullReferenceException. Как мне теперь пройти через XML?
Какую версию .NET вы используете? LINQ to XML намного проще, чем XPathDocument, особенно в VB.NET, где вы можете использовать XML-литералы inline. –
Я использую .NET 4.0 – PsychoCoder
Затем используйте LINQ to XML и игнорируйте XPathDocument и XmlDocument. –