XML Query未返回预期结果

时间:2017-03-17 11:53:42

标签: xml xpath

给出以下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]

为什么查询会返回包含“可退款”的第一个(酒店)&#39;房间而不是第二家包含“不可退款”的酒店。酒店?查询有什么问题和/或是否有可行的查询?

1 个答案:

答案 0 :(得分:2)

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

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

或者您可以将XPath修改为

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

请注意

  1. 我删除了["RoomRate"]谓词,因为字符串将始终返回True
  2. 我将//*[@RefundType...替换为.//*[@RefundType...,因为您的表达方式意味着
  3.   

    查找任何元素,如果其名称为"AccommodationSegment",并且文档中是否有任何元素具有属性RefundType="non_refundable" SOMEWHERE

    而我的表达意味着:

      

    查找任何元素,如果其名称为"AccommodationSegment",并且 IT CONTAINS 任何具有属性RefundType="non_refundable"的元素

相关问题