2014-11-20 2 views
1

XML 데이터를 구문 분석하기 위해 simplexml_load_string을 사용하고 있습니다. 특정 하위 노드가 누락 된 것처럼 보이는 예외를 제외하고는 모든 것이 잘 진행되고 있습니다. 다음은 원본 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

덕분에 일을 많이들. 여전히 print_r() 또는 debug()가이 1 가지 경우에는 작동하지 않았지만 알아두면 좋은 이유는 아직 100 % 확실하지 않습니다. – JerryAsk

+0

Simplexml에는 많은 마법이 있으며'print_r()'또는'var_dump()'를 사용하면 전체 그림을 보여주지 않습니다. '-> asXML()'이 안전하다는 것이 확실합니다. 'debug()'는 XML 구조를 보여주는 비슷한 문제를 가지고 있지만, 작성된 것처럼 XML 구조를 보여주기 위해서는'-> asXML()'을 사용하면된다. 'print_r'이 그것을 어떻게 표시하는지에 대한 규칙을 배우고 싶다면, ** SimpleXMLElement **를 배열로 캐스팅 할 때 일어나는 일을 읽어보십시오. – hakre

답변

2

케익을 모르지만 print_r을 신뢰할 수 있으며 var_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

+0

당신은 절대적으로 맞습니다, @CBroe – michi

+0

나는 실제로 var_dump를 시도한 적이 없습니다. 다른 모든 경우에는 debug()가 작동 한 다음 print_r()을 시도하고 세 번째 방법을 시도하지 않았습니다. – JerryAsk