2017-03-17 125 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