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节点。

+0

非常感谢球员,那工作。仍然不是100%确定为什么print_r()或debug()在这种情况下不起作用,但很好知道。 – JerryAsk 2014-11-20 20:37:10

+0

Simplexml有很多魔力,并且使用'print_r()'或'var_dump()'永远不会显示出整个图片。建议' - > asXML()'是安全的。最有可能的是'debug()'有类似的问题来显示XML结构,但是正如所写的,为了显示XML结构,使用' - > asXML()',你应该没问题。如果您想了解为什么'print_r'确实按照它的方式显示它的规则,请阅读将SimpleXMLElement **转换为数组时发生的情况。 – hakre 2014-11-23 13:23:08

不知道CAKE,但不相信print_rvar_dump()SimpleXML

而是做

$xml = simplexml_load_string($x); // assume XML in $x 
echo $xml->asXML(); 

,瞧,XML是完整的,在行动中看到:https://eval.in/224134

+0

var_dump也显示了预期的元素,https://eval.in/224168 - 所以问题可能是由于OP的系统上的某个扩展覆盖了var_dump,或者cakephp正在搞乱它。 – CBroe 2014-11-20 19:23:09

+0

你是绝对正确的,@CBroe – michi 2014-11-20 22:35:26

+0

我从来没有真正尝试过var_dump。在所有其他情况下,debug()工作,然后我尝试了print_r(),并且从来没有尝试过第三种方法。 – JerryAsk 2014-11-21 02:53:51