Мне пришлось переписать часть программы для использования XMLReader для выбора частей XML-файла для обработки.Выбор родительских узлов с помощью XMLReader
Возьмите этот упрощенный XML в качестве примера:
<odds>
<sport>
<region>
<group>
<event name="English Championship 2014-15" eventid="781016.1">
<bet name="Kazanan" betid="12377108.1">
<selection selectionid="52411062.1"/>
</selection>
</bet>
</event>
</group>
</region>
</sport>
</odds>
Этот вызов xpath()
:
$bets = $xml->xpath(
"//odds/sport/region/group/event/bet/selection[contains(@selectionid,'".$selectionToFind."')]/.."
);
выберет весь <bet>
узел и его потомков (<selection>
узлы).
Мой код, однако, будет выбран только один <selection>
узел с заданным selectionid
:
$reader = new XMLReader;
$reader->open('file.xml');
while($reader->read()) {
$event = $reader->getAttribute($value);
if ($event == 781016.1) {
$node = new SimpleXMLElement($reader->readOuterXML());
var_dump($node);
break;
}
}
Как реплицировать поведение xpath()
с XMLReader
так что я выбираю <bet>
узел и его потомков, а не только один <selection>
ребенок?
Я думаю, вопрос сводится к следующему: Можно ли выбрать весь родительский узел <bet>
значением атрибута дочернего элемента, например. <selection selectionid="[some_value]">
?
2 вещи. У вас на самом деле есть только один узел выбора в вашем XML. И во-вторых, ваш код должен выбрать заметку «событие», как сейчас, а не «ставку». Заметка «event» имеет атрибут «eventid». –
@ Ясен Желев, извините, я уже включил редактирование. Фактически в моем коде есть переменная '$ value'. Он также инкапсулирован в методе класса. Я просто воспроизвел упрощенные представления - то же, что и XML - он намного больше. Я думаю, вопрос сводится к: Можно ли выбрать весь родительский узел '' значением атрибута дочернего элемента, например. ''? –
luqo33
ОК, проверьте мой обновленный ответ. Я думаю, это поможет вам решить эту проблему. –