2013-03-01 3 views
1

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

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 fr om my simplexml-object $xml.

+0

В вашем XML есть ошибка, по крайней мере, raw = «12 отсутствует», которая не может быть hleping или это просто ошибка здесь? – Dave

+0

@Dave: спасибо, mistype, отредактировал его – michi

+0

вы можете предоставить некоторый фактический код php, например, как вы пытаетесь запросить его в данный момент – Dave

ответ

4

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

Live demo

$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.

0

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

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

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

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

спасибо за совет, все еще пытающийся с чистым xpath ... – michi

Смежные вопросы