2013-03-01 108 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> 

現在,我要選擇具有<d>節點的t -Attribute ...

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我simplexml對象$xml

+0

在你的XML中有一個錯誤,至少raw =「12缺少一個」,這可能不是hleping或者只是這裏的一個錯誤類型? – Dave 2013-03-01 13:08:33

+0

@Dave:謝謝,錯誤類型,編輯它 – michi 2013-03-01 13:12:56

+0

你能否提供一些實際的php代碼,如你試圖查詢它在 – Dave 2013-03-01 13:23:08

回答

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循環和拉使用這樣的標準屬性(注意不是準確的,但正確的概念)

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

感謝您的建議,仍然嘗試純xpath ... – michi 2013-03-01 19:59:47