Мне нужно выбрать узлы из 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"; }