2017-03-17 124 views
1

鑑於以下XML:XML查詢沒有返回預期的結果

<?xml version="1.0" encoding="UTF-8"?> 
<Accommodations> 
<AccommodationSegment AccommodationCode="627|26234" AccommodationId="15390132" AccommodationName="blah" Availability="available" BasicAdultCost="180.16" BoardCode="SC" BookableByFAB="true" BrandName="blah" ClassCode="2*" Currency="GBP" EndDate="20170918" ItineraryId="si1068" MaxChildAge="17" NormalisedName="BLAH" NumNights="7" ResortId="558" ResortName="blah" StartDate="20170911" Supplier="TT2" SyndicatorRanking="100" Type="Apartments"> 
    <AvailableBoardBasis>BB</AvailableBoardBasis> 
    <AvailableBoardBasis>HB</AvailableBoardBasis> 
    <AvailableBoardBasis>SC</AvailableBoardBasis> 
    <Address Address1="blah" Address2="blah" Address3="Tenerife" CityOrTown="Puerto de la Cruz" Country="ES" PostCode="34324" /> 
    <TelephoneNumber>+34 922370565</TelephoneNumber> 
    <Description>blah blah blah blah blah blah blah blah blah blah blah blah 
    blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah</Description> 
    <GeoPosition Latitude="28.4129" Longitude="-16.5437" /> 
    <DirectLink System="FABRIX"> 
    <DirectLinkURL><![CDATA[https://ww9.website.com/deep_linking/deep_linking.html?rooms=1&amp;journey=Hotels&amp;checkinDate=11092017&amp;duration=7&amp;suppliers=TT2&amp;accommodationId=15390132]]></DirectLinkURL> 
    </DirectLink> 
    <AccommodationUnits> 
    <AccommodationUnit AUID="H2" Code="2SC" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Studio - Self catering" QuantityAvailable="9"> 
     <RoomRate Amount="180.16" BoardBasis="SC" Currency="GBP" EndDate="20170918" RefundType="refundable" StartDate="20170911" /> 
    </AccommodationUnit> 
    <AccommodationUnit AUID="H2" Code="2BB" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Studio - Bed and Breakfast" QuantityAvailable="9"> 
     <RoomRate Amount="216.91" BoardBasis="BB" Currency="GBP" EndDate="20170918" RefundType="refundable" StartDate="20170911" /> 
    </AccommodationUnit> 
    <AccommodationUnit AUID="H2" Code="2HB" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Studio - Half board" QuantityAvailable="9"> 
     <RoomRate Amount="268.36" BoardBasis="HB" Currency="GBP" EndDate="20170918" RefundType="refundable" StartDate="20170911" /> 
    </AccommodationUnit> 
    </AccommodationUnits> 
    </AccommodationSegment> 
<AccommodationSegment AccommodationCode="627|26234" AccommodationId="15390132" AccommodationName="blah" Availability="available" BasicAdultCost="180.16" BoardCode="SC" BookableByFAB="true" BrandName="blah" ClassCode="2*" Currency="GBP" EndDate="20170918" ItineraryId="si1068" MaxChildAge="17" NormalisedName="BLAH" NumNights="7" ResortId="558" ResortName="blah" StartDate="20170911" Supplier="TT2" SyndicatorRanking="100" Type="Apartments"> 
    <AvailableBoardBasis>BB</AvailableBoardBasis> 
    <AvailableBoardBasis>HB</AvailableBoardBasis> 
    <AvailableBoardBasis>SC</AvailableBoardBasis> 
    <Address Address1="blah" Address2="blah" Address3="Tenerife" CityOrTown="Puerto de la Cruz" Country="ES" PostCode="73737" /> 
    <TelephoneNumber>0034 922384811</TelephoneNumber> 
    <Description>blah blah blah blah blah blah blah blah blah blah blah blah 
    blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah</Description> 
    <GeoPosition Latitude="28.4119" Longitude="-16.5473" /> 
    <DirectLink System="FABRIX"> 
    <DirectLinkURL><![CDATA[https://ww9.website.com/deep_linking/deep_linking.html?rooms=1&amp;journey=Hotels&amp;checkinDate=12092017&amp;duration=7&amp;suppliers=TT2&amp;accommodationId=16271549]]></DirectLinkURL> 
    </DirectLink> 
    <AccommodationUnits> 
    <AccommodationUnit AUID="H4476" Code="4476BB" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Double Room for Single Use - Bed and Breakfast" QuantityAvailable="9"> 
     <RoomRate Amount="250.04" BoardBasis="BB" Currency="GBP" EndDate="20170919" RefundType="non_refundable" StartDate="20170912" /> 
    </AccommodationUnit> 
    <AccommodationUnit AUID="H4476" Code="4476HB" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Double Room for Single Use - Half board" QuantityAvailable="9"> 
     <RoomRate Amount="276.97" BoardBasis="HB" Currency="GBP" EndDate="20170919" RefundType="non_refundable" StartDate="20170912" /> 
    </AccommodationUnit> 
    <AccommodationUnit AUID="H4476" Code="4476FB" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Double Room for Single Use - Full board" QuantityAvailable="9"> 
     <RoomRate Amount="303.88" BoardBasis="FB" Currency="GBP" EndDate="20170919" RefundType="non_refundable" StartDate="20170912" /> 
    </AccommodationUnit> 
    <AccommodationUnit AUID="H4476" Code="4476AI" MaxExtraChildren="0" MaxExtraInfants="0" MaxOccupancy="1" MinOccupancy="1" Name="Double Room for Single Use - All inclusive" QuantityAvailable="9"> 
     <RoomRate Amount="317.34" BoardBasis="AI" Currency="GBP" EndDate="20170919" RefundType="non_refundable" StartDate="20170912" /> 
    </AccommodationUnit> 
    </AccommodationUnits> 
    </AccommodationSegment> 
</Accommodations> 

而下面的XPath查詢: - 包含 '退還'

(//*[local-name()="AccommodationSegment" and //*["RoomRate"][@RefundType="non_refundable"]])[1] 

爲什麼查詢返回第一個(酒店)房間,而不是第二家酒店,其中包含'non_refundable'酒店?查詢有什麼問題和/或有沒有可用的查詢?

+0

你想要得到什麼確切的輸出的任何元素? – Andersson

+0

我希望第一個包含不可退款的房間,其中xml中的屬性爲'RefundType'。使用這個工具:http://codebeautify.org/Xpath-Tester你會發現我的查詢返回第一個,它包含'refundable',而不是我期望的 - 第一個包含non_refundable – Steerpike

+0

你確定你需要'AccommodationSegment',但不需要'AccommodationUnits'或'AccommodationUnit'?在提供的'xml'示例中只有一個'AccommodationSegment',它同時具有''和'' – Andersson

回答

2

您可以使用下面XPath表達式包含<RoomRate RefundType="non_refundable">第一AccommodationSegment匹配元素:

(//AccommodationSegment[./descendant::RoomRate[@RefundType="non_refundable"]])[1] 

,或者你可以修改你的XPath作爲

(//*[local-name()="AccommodationSegment" and .//*[@RefundType="non_refundable"]])[1] 

注意

  1. 我刪除["RoomRate"] pred icate作爲字符串將始終返回True
  2. 我換成//*[@RefundType....//*[@RefundType...作爲表達手段

找到任何元素,如果它的名字是"AccommodationSegment",如果有與屬性RefundType="non_refundable"某處文檔中的任何元素

,而我表達的意思是:

找到任何元素,如果它的名字是"AccommodationSegment"如果包含與屬性RefundType="non_refundable"

+0

美妙 - 謝謝 – Steerpike