Intereting Posts
MySQL и PHP: UTF-8 с кириллицей Передача переменной с одной страницы на другую в php для динамического заполнения открываемых тегов Facebook CakePHP: Session-> write () не работает Как избежать навигации по папкам с помощью манипуляции URL MailChimp API 2.0 Пакетная подписка PHP Обновить поле инкремента запроса плюс 1 codeigniter требуется обновление для запроса mysql для выбора диапазона дат для бронирования гостиничного номера или любой вещи Должен ли PHP_EOL использоваться в электронных письмах? Разбирайте адреса электронной почты с помощью PHP? Вызов функции-члена fetch_assoc () для не-объекта Получить элементы DOM по имени тега с помощью DOMDocument :: loadHTML и getElementsByTagName Функция PHP для проверки времени между заданным диапазоном? Я не могу начать работу с приложением Zend Framework 2 скелета автоматический прирост для simpleXML Сделайте работу по регистрации веб-сайта в WordPress тоже

php xpath извлекает значения атрибутов на основе нескольких атрибутов и родительских атрибутов

Мне нужно выбрать узлы из xml, условия см. Ниже. Я использую simplexml, поэтому xpath должен быть 1.0.

XML-фрагмент:

<scales> <scale id="1" gender="*" age="*"> <d scid="hi" raw="10" t="76" /> <d scid="pn" raw="12" t="80" /> </scale> <scale id="2" gender="m" age="*"> <d scid="hi" raw="8" t="79" /> <d scid="pn" raw="2" t="50" /> </scale> <scale id="3" gender="*" age="19-39"> <d scid="hi" raw="0" t="48" /> <d scid="pn" raw="10" t="49" /> </scale> </scales> 

Теперь я хочу выбрать t атрибут узла <d> который имеет …

  raw="10" AND scid="hi" $result=$xml->xpath('//d[@scid="hi"][@raw="10"]/@t'); 

И его родительский узел <scale> имеет …

 (gender="*" OR gender="m") AND (age="*" OR age="39-59") $result=$xml->xpath('//scale[@gender="*" or @gender="m"][@age="*" or @age="39-59"]'); 

Я хотел бы получить это с 1 xpath-statement из моего simplexml-object $xml .

Просто объедините два запроса XPath …

Демо-версия

 $str=<<<XML <scales> <scale id="1" gender="*" age="*"> <d scid="hi" raw="10" t="76" /> <d scid="pn" raw="12" t="80" /> </scale> <scale id="2" gender="m" age="*"> <d scid="hi" raw="8" t="79" /> <d scid="pn" raw="2" t="50" /> </scale> <scale id="3" gender="*" age="19-39"> <d scid="hi" raw="0" t="48" /> <d scid="pn" raw="10" t="49" /> </scale> </scales> XML; $xml=simplexml_load_string($str); foreach($xml->xpath('//scale[@gender="*" or @gender="m"][@age="*" or @age="39-59"]/d[@scid="hi"][@raw="10"]/@t') as $t) { echo $t; } 

Выходы 76 .

ok быстро читать в xpath кажется, что вы можете сделать атрибут соответствия что-то вроде этого

  $path = "(scale[@gender=\"*\"]|scale[@gender=\"m\"]) & (scale[@age=\"*\"]|scale[@age=\"39-59\"])"; $scale= $xml->xpath($path); 

Это должно вернуть вам фактический масштабный тег, который вы хотите. Затем вы можете запрограммировать цикл через теги в пределах возвращаемой $ scale и вытащить стандартные атрибуты, используя что-то вроде этого (обратите внимание на точную, но правильную концепцию)

 foreach($scale->d[0]->attributes() as $a => $b => $c) { echo "t=$c\"\n"; }