获取 XML 和 PHP 中的父元素索引


getting parent element's index in xml and php?

我正在尝试获取父元素,我想到了一个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');

欢迎任何想法。

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

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

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

Ok 想通了!!!这是我用来获取具有文本 = 值的节点的方法。然后我得到了所有的兄弟元素。

// load as file
$contents = new SimpleXMLElement($source,null,true);
$result = $contents->xpath('HotelRoomResponse[roomTypeCode="17918"]');
foreach($result as $key=>$node)
{
  $cancelPolicy = $node->cancellationPolicy;
}
$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);
}

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