2016-01-31 2 views
1

Ниже мой XML с пространством именполучить значения из Xpath

<?xml version="1.0" encoding="UTF-8"?> 
    <hotels xmlns="http://www.test.com/schemas/messages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="http://www.test.com/schemas/messages"> 
    <hotel > 
     <rooms> 
      <room> 
       <rates> 
        <rate id="1" adults="1" child="0"></rate> 
        <rate id="2" adults="2" child="0"></rate> 
        <rate id="3" adults="1" child="0"></rate> 
       </rates> 
      </room> 
      <room> 
       <rates> 
        <rate id="4" adults="1" child="0"></rate> 
        <rate id="5" adults="2" child="0"></rate> 
        <rate id="6" adults="2" child="0"></rate> 
       </rates> 
      </room> 
     </rooms> 
    </hotel> 
    </hotels> 

я пытаюсь ниже код PHP (XPath), используя Еогеасп, чтобы получить значения ratenode

$xd = simplexml_load_file('C:/inetpub/vhosts/test.com/data_download/q.xml'); 
    $xd->registerXPathNamespace("n", "http://www.test.com/schemas/messages");  

foreach($xd->xpath("//n:hotels/n:hotel") as $xd_item) 
     { 
      echo 'item - A'; 
      foreach($xd_item->xpath("rooms/room") as $xd_room) 
      { 
       foreach($xd_room->xpath("rates/rate") as $xd_rate) 
       { 
        echo 'rate - C'; 
       } 
      } 
     } 

В Еогеасп от $ xd_item является не работает. Я имею в виду 2-й foreach его конец со значением "echo 'item - A';" любой может мне помочь?

+0

Не знаю, как вы думаете, 'эхо«скорость - C'' получит „значения ratenode“, но обратите внимание, что 'комнаты',' room', 'rates' и' rate' должны быть префиксны с помощью 'n:', потому что они тоже находятся в стандартном 'http: // www.test.com/schemas/messages' Пространство имен. – kjhughes

+0

спасибо, Как я вхожу в сторону, что-то вроде echo '$ xd_rate-> attributes() -> id' – Note

+0

Я бы предложил вместо этого использовать DomDocument: http://www.w3schools.com/php/php_xml_dom.asp , так как это совпадение более легко разобрать xml, используя его – Armen

ответ

0

Проблема с вашими кодами, как упоминалось в комментарии к @kjhughes, состоит в том, что некоторые элементы находятся в пространстве имен по умолчанию, но ваш XPath не использовал соответствующий префикс для этих элементов. Кроме того, ваш код печатает статические литеральные строки i.e 'item - A' и 'rate - C', а не какую-либо часть анализируемого XML.

"можно написать условия, такие как $xd->xpath("rates/rate[@id='1']") в дом"

Да, это возможно. Также можно с помощью SimpleXML, например:

$xd->registerXPathNamespace("n", "http://www.test.com/schemas/messages"); 
foreach($xd->xpath("//n:rate[@id='1']") as $rate){ 
    echo $rate["id"] .", ". $rate["adults"] .", ". $rate["child"] ."\r\n"; 
} 

eval.in demo

выход:

//id, adults, rate 
1, 1, 0 
0

Переменная $xd_item имеет тип SimpleXMLElement, из которого вы можете получить доступ к его комнатные свойства, подобные этому, например:

$xd_item->rooms->room

Это будет возвращать объект типа SimpleXMLElement, из которого вы можете получить ставки, и вы можете цикл с использованием foreach. Значения, которые вы хотите от «скорости» находятся в attributes

Например:

$xd = simplexml_load_file('C:/inetpub/vhosts/test.com/data_download/q.xml'); 
$xd->registerXPathNamespace("n", "http://www.test.com/schemas/messages"); 

foreach($xd->xpath("//n:hotels/n:hotel") as $xd_item) 
{ 
    foreach($xd_item->rooms->room as $room) { 
     foreach ($room->rates->rate as $rate) { 
      echo sprintf(
       'id: %s<br>adults: %s<br>child: %s<br><br>', 
       $rate->attributes()->id->__toString(), 
       $rate->attributes()->adults->__toString(), 
       $rate->attributes()->child->__toString() 
      ); 
     } 
    } 
} 
Смежные вопросы