0

我正在尝试获取父元素,我想到了一个 XML 标记。基本上我需要查看多个<HotelRoomResponse>结果并找到包含具有此确切数值的子标签的父标签: <roomTypeCode>17918</roomTypeCode>我不确定如何执行此操作或最好的方法。因为然后我需要获取该特定<HotelRoomResponse>. 这是一个示例 XML 响应:

<HotelRoomResponse>
    <cancellationPolicy> </cancellationPolicy>
    <rateCode>200482409</rateCode>
    <roomTypeCode>17918</roomTypeCode>
    <rateDescription>
       Deluxe Sunset View - All Inclusive-Up to $300Resort Credit
    </rateDescription>
    <roomTypeDescription>
       Deluxe Sunset View - All Inclusive-Up to $300Resort Credit
    </roomTypeDescription>
    <supplierType>E</supplierType>
</HotelRoomResponse>

所以这些结果类型有很多种,我需要遍历它并找到这个特定的类型。

这是我连接到 XML 的方式:

$ch = curl_init(); 
$fp = fopen('room_request.xml','w'); 
curl_setopt($ch, CURLOPT_URL, "http://api.ean.com/ean-services/rs/hotel/v3/avail?cid=55505&minorRev=13&apiKey=4sr8d8bsn75tpcuja6ypx5g3&locale=en_US&currencyCode=USD&customerIpAddress=10.184.2.9&customerUserAgent=Mozilla/5.0+(Windows+NT+6.1)+AppleWebKit/535.11+(KHTML,+like+Gecko)+Chrome/17.0.963.79+Safari/535.11&customerSessionId=&xml=<HotelRoomAvailabilityRequest><hotelId>".$hid."</hotelId><arrivalDate>05/14/2012</arrivalDate><departureDate>05/18/2012</departureDate><RoomGroup><Room><numberOfAdults>3</numberOfAdults><numberOfChildren>0</numberOfChildren><childAges>0</childAges></Room></RoomGroup><includeDetails>true</includeDetails></HotelRoomAvailabilityRequest>");  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/xml'));  
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_FILE, $fp); 
$val = curl_exec($ch); 
curl_close($ch);//Close curl session 
fclose($fp); //Close file overwrite 
$avail = simplexml_load_file('room_request.xml');

欢迎任何想法。

4

3 回答 3

0
$xml = new SimpleXMLElement('room_request.xml');

/* Search for <HotelRoomResponse><roomTypeCode> */
$result = $xml->xpath('/HotelRoomResponse/roomTypeCode');

结果将为您提供节点列表,然后您可以检查并在适当时获取父节点

见这里http://www.php.net/manual/en/simplexmlelement.xpath.php

编辑 2. 关键是命名空间

   <?php
$ch = curl_init(); 
$fp = fopen('room_request.xml','w'); 
curl_setopt($ch, CURLOPT_URL, "http://travellinginmexico.com/test/room_request.xml");  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/xml'));  
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_FILE, $fp); 
$val = curl_exec($ch); 
curl_close($ch);//Close curl session 
fclose($fp); //Close file overwrite

$xml = new SimpleXMLElement(file_get_contents('room_request.xml'));

/* Search for <HotelRoomResponse><roomTypeCode> */
$xml->registerXPathNamespace('ns2', 'http://v3.hotel.wsapi.ean.com/');
$result = $xml->xpath("HotelRoomResponse[child::roomTypeCode[text() = '153725']]");
foreach($result as $obj=>$node)
{
    var_dump($node->roomTypeCode);
}

通过您发送的示例将获得特定信息

于 2012-04-08T15:28:20.753 回答
0

要查找具有值为HotelRoomResponse的子节点的所有节点,请使用以下命令:roomTypeCode'17918'

$match = $avail->xpath("/HotelRoomResponse[child::roomTypeCode[text() = '17918']]");

编辑: $match 将是一个包含所有匹配项的数组。

于 2012-04-08T15:46:34.960 回答
0

好的,想通了!!!!这是我用来获取带有 text = value 的节点的内容。然后我得到了所有兄弟元素。

// load as file
$contents = new SimpleXMLElement($source,null,true);
$result = $contents->xpath('HotelRoomResponse[roomTypeCode="17918"]');

foreach($result as $key=>$node)
{
  $cancelPolicy = $node->cancellationPolicy;
}
于 2012-04-08T16:57:54.027 回答