php DOM xml синтаксический анализ geon неправильно

#php #xml

#php #xml

Вопрос:

Кажется, я не могу разобрать свой XML сегодня. Что я сделал не так? Я надеюсь, что кто-нибудь может указать мне на лучшее / рабочее решение.

Я хочу проанализировать XML-файл маршрута автобуса, который выглядит следующим образом:

 <buses>
<bus>
 <num>12</num>
 <stime>05:00</stime>
 <etime>22:00</etime>
 <freq>?</freq>
 <route>
  <stop>Eonyang Bus Terminal</stop>
  <stop>Chuk Hyub</stop>
  <stop>Eonyang Bolim Hospital</stop>
  <stop>Samnammyeong Residential Center</stop>
  <stop>SinAn</stop>
 </route>
</bus>
<bus>
 <num>13</num>
 <stime>?</stime>
 <etime>?</etime>
 <freq>?</freq>
 <route>
  <stop>KTX Ulsan Station</stop>
  <stop>Driving Hagwon</stop>
  <stop>Jayeon Science High School</stop>
  <stop>Eonyang Bus Stop</stop>
  <stop>Bolim Hospital</stop>
  <stop>Daewon Green Apt.</stop>
</route>
 

На основе пользовательского ввода источника и назначения я хочу выполнить поиск по списку остановок, чтобы найти нужный автобус или автобусы, но простой анализ этого списка не работает.

 <?php

$xmlDoc = new DOMDocument();
$xmlDoc->load("buses-new.xml");

$buses=$xmlDoc->getElementsByTagName('bus');


for($i=0; $i<($buses->length); $i  ) {

   $route=$buses->item($i)->getElementsByTagName('route');
   $busnum=$buses->item($i)->getElementsByTagName('num');


   foreach( $route->childNodes as $stop) {

      $loc = $stop->nodeValue;

     if (stristr($loc,$orig))  {
         // found a bus with origin
    $origins[$ocount]= $i;
    $ocount  ;
     }

     if (stristr($loc,$dest)) {
    // found a bus with destination
    $destination[$dcount] = $i;
    $dcount  ;
     }


  } // for all stops

} // for all buses
 

Я получаю сообщение об ошибке —- foreach( $route-> Дочерние узлы как $stop) — указано в недопустимом аргументе.

каков правильный способ анализа неопределенного списка дочерних узлов из каждого маршрута?

Ответ №1:

Вам нужно выполнить одно из следующих действий:

Если вы знаете, что в элементе шины есть только один элемент маршрута:

Изменить

 $route=$buses->item($i)->getElementsByTagName('route');
 

Для

 $route=$buses->item($i)->getElementsByTagName('route')->item(0);
 

Если может быть несколько элементов маршрута, вам необходимо выполнить итерацию:

 $routes = $buses->item($i)->getElementsByTagName('route');
foreach($routes as $route)
{
    foreach( $route->childNodes as $stop) {
    ...
}
 

Ответ №2:

$route — это DOMNodeList. Ты хочешь:

 $route=$buses->item($i)->getElementsByTagName('route')->item(0);
 

кроме того, разве не намного приятнее повторять с foreach ?

 foreach($buses as $bus) {
  $route = $bus->getElementsByTagName('route')->item(0);
  $busnum = $bus->getElementsByTagName('num')->item(0);
}
 

Комментарии:

1. в автобусах мне нужна позиция элемента в списке — мне придется взаимодействовать с этим подмножеством, чтобы найти общие пункты назначения, когда один автобус не добирается из пункта A в пункт B, но общая точка C является остановкой для двух автобусов.,

2. Ах, я понимаю. Тем не менее, кажется, что лучше делать foreach и просто использовать $position