#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