SimpleXMLElement对象缺少节点
问题描述:
我正在使用simplexml_load_string来解析XML数据。一切都一直很好,除了一个例外,其中某些子节点似乎缺失。以下是原始XML输出的示例:SimpleXMLElement对象缺少节点
<LEAGUE Name="NFL Football">
<EVENT GameID="371667" Title="Kansas City Chiefs at Oakland Raiders" Date="2014-11-20" Time="20:25" Timezone="EST" Status="SCHEDULED" Enabled="true">
<TOTALS Over="42.5" OverOdds="-110.0" OverEnabled="true" Under="42.5" UnderOdds="-110.0" UnderEnabled="true"/>
<CONTESTANT Name="Kansas City" Score="0" RotationNumber="109">
<LINE Money="-355.0" MoneyEnabled="true" Points="-7.5" Odds="-115.0" PointsEnabled="true"/>
</CONTESTANT>
<CONTESTANT Name="Oakland" Score="0" RotationNumber="110">
<LINE Money="295.0" MoneyEnabled="true" Points="7.5" Odds="-105.0" PointsEnabled="true"/>
</CONTESTANT>
</EVENT>
除LINE节点外,一切正常。如果我做了print_r的,它会显示这样的(跳过,为简洁的竞争者节点):
[CONTESTANT] => Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[Name] => Kansas City
[Score] => 0
[RotationNumber] => 109
)
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[Money] => -355.0
[MoneyEnabled] => true
[Points] => -7.5
[Odds] => -115.0
[PointsEnabled] => true
)
)
)
从子节点的数据是存在的(金钱,MoneyEnabled等),但它不是LINE节点内预期。事实上,我一直无法通过SimpleXML对象访问这些信息。使用CakePHP的调试功能,LINE数据甚至不会显示出来。我在整个地方都使用了这个函数,这是任何SimpleXML数据不显示的唯一时间。使用CakePHP的调试:
object(SimpleXMLElement) {
@attributes => array(
'GameID' => '371667',
'Title' => 'Kansas City Chiefs at Oakland Raiders',
'Date' => '2014-11-20',
'Time' => '20:25',
'Timezone' => 'EST',
'Status' => 'SCHEDULED',
'Enabled' => 'true'
)
TOTALS => object(SimpleXMLElement) {
@attributes => array(
'Over' => '42.5',
'OverOdds' => '-110.0',
'OverEnabled' => 'true',
'Under' => '42.5',
'UnderOdds' => '-110.0',
'UnderEnabled' => 'true'
)
}
CONTESTANT => array(
(int) 0 => object(SimpleXMLElement) {
@attributes => array(
'Name' => 'Kansas City',
'Score' => '0',
'RotationNumber' => '109'
)
},
(int) 1 => object(SimpleXMLElement) {
@attributes => array(
'Name' => 'Oakland',
'Score' => '0',
'RotationNumber' => '110'
)
}
)
正如你所看到的,还有每个选手节点下没有LINE节点。
答
不知道CAKE,但不相信print_r
和var_dump()
与SimpleXML
。
而是做
$xml = simplexml_load_string($x); // assume XML in $x
echo $xml->asXML();
,瞧,XML是完整的,在行动中看到:https://eval.in/224134
非常感谢球员,那工作。仍然不是100%确定为什么print_r()或debug()在这种情况下不起作用,但很好知道。 – JerryAsk 2014-11-20 20:37:10
Simplexml有很多魔力,并且使用'print_r()'或'var_dump()'永远不会显示出整个图片。建议' - > asXML()'是安全的。最有可能的是'debug()'有类似的问题来显示XML结构,但是正如所写的,为了显示XML结构,使用' - > asXML()',你应该没问题。如果您想了解为什么'print_r'确实按照它的方式显示它的规则,请阅读将SimpleXMLElement **转换为数组时发生的情况。 – hakre 2014-11-23 13:23:08