我有以下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']
答案 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中的所有内容,并不意味着如果您要求它,数据就不可用。