SimpleXMLElement获取非属性值

时间:2016-11-16 09:27:51

标签: php xml-parsing simplexml

我有以下SimpleXMLElement:

object(SimpleXMLElement)#10 (3) { 
    ["@attributes"]=> array(3) { 
        ["id"]=> string(8) "18022352" 
        ["name"]=> string(14) "The Salmon Man" 
        ["slug"]=> string(14) "the-salmon-man" 
    } 

    ["bids"]=> object(SimpleXMLElement)#11 (1) { 
        ["price"]=> array(1) { 
                [0]=> object(SimpleXMLElement)#13 (1) { 
                        ["@attributes"]=> array(4) { 
                                ["decimal"]=> string(4) "9.60" 
                                ["percent"]=> string(5) "10.42" 
                                ["backers_stake"]=> string(5) "40.36" 
                                ["liability"]=> string(6) "347.00" 
                        } 
                 } 
        } 
    } 

    ["offers"]=> object(SimpleXMLElement)#12 (1) { 
        ["price"]=> array(1) { 
                [0]=> object(SimpleXMLElement)#15 (1) { 
                        ["@attributes"]=> array(4) { 
                                ["decimal"]=> string(4) "9.20" 
                                ["percent"]=> string(5) "10.87" 
                                ["backers_stake"]=> string(5) "85.35"         
                                ["liability"]=> string(5) "10.41" 
                        } 
                }  
        } 
    }
}

为什么这样做:

$horse[0]['name']

但这并不是:

$horse[0]['bids'] // also tried $horse['bids'] and other ways

我可以得到如下的值,但我希望搜索较小的对象:

$xml->xpath("//odds/event[@id='$matchid']/market[@slug='to-win']/contract[@name='$pony']/bids"); // $pony == $horse[0]['name']

1 个答案:

答案 0 :(得分:0)

通常更容易查看XML本身,而不是SimpleXML对象的print_r。在这种情况下,你有这样的事情:

<horse id="18022352" name="The Salmon Man" slug="the-salmon-man">
    <bids>
         <price decimal="9.60" percent="10.42" backers_stake="40.36" liability="347.00" />
    </bids>
    <offers>
         <price decimal="9.60" percent="10.42" backers_stake="40.36" liability="347.00" />
    </offers>
</horse>

bids项是元素,如the SimpleXML Basic Usage guide中所述,您可以使用->foo表示法访问子元素,而属性使用{{1}记谱法。

因此如果['foo']$horse元素,则需要:

<horse>

请注意,这相当于明确要求名为$name = $horse['name']; $bids = $horse->bids; 第一个子项;无论实际上是否存在多个相同的名称元素,两种形式都将起作用:

bids

现在可能有一个或多个$bids = $horse->bids[0]; 元素在实践中,因此您可能希望循环,然后回显每个<price>属性。这看起来像这样:

decimal

同样,只有一个foreach ( $horse->bids->price as $price ) { echo $price['decimal']; } ,这个循环才能正常工作,它只会循环一次。如果只有一个价格,或者你只关心第一个价格,你可以写:

<price>

相当于:

echo $horse->bids->price['decimal'];

当然,或者其中之一:

echo $horse->bids[0]->price[0]['decimal'];

到达同一个地方的不同方式的数量是我不建议过度依赖echo $horse->bids[0]->price['decimal']; echo $horse->bids->price[0]['decimal']; 输出的一个原因。另一个原因是它有时无法显示XML中的所有内容,并不意味着如果您要求它,数据就不可用