SimpleXML / PHP - не удается получить доступ к объекту - PullRequest
3 голосов
/ 30 августа 2011
$tmp2 = '<?xml version="1.0"?><RWResponse><RESPONSE><DATA><HEADER><COLUMN>interval</COLUMN><COLUMN>name</COLUMN></HEADER></DATA></RESPONSE></RWResponse>';
$xml = simplexml_load_string($tmp2);
echo $xml->RESPONSE->DATA->HEADER->COLUMN[0];

Выше ничего не будет выводиться, даже если var_dump является успешным:

object(SimpleXMLElement)#2 (1) {
  ["RESPONSE"]=>
  object(SimpleXMLElement)#3 (1) {
    ["DATA"]=>
    object(SimpleXMLElement)#4 (1) {
      ["HEADER"]=>
      object(SimpleXMLElement)#5 (1) {
        ["COLUMN"]=>
        array(2) {
          [0]=>
          string(8) "interval"
          [1]=>
          string(13) "creative_name"
        }
      }
    }
  }
}

Спасибо

Ответы [ 5 ]

2 голосов
/ 30 августа 2011

Это потому, что SimpleXML требует точного приведения типов, или вы получите нелепые вещи, подобные этим - var_dump выведет то, что вы хотите, echo - нет.Вы всегда должны это делать, есть еще худшие ошибки, например, echo ceil($simplexml->someNumber) выведет 7, если число, например, 7.85 и так далееПопробуйте вместо:

echo (string)$xml->RESPONSE->DATA->HEADER->COLUMN[0];
2 голосов
/ 30 августа 2011

Ввод XML действителен, я полагаю, проблема в вашей настройке PHP (старая или ошибочная версия).Это вывод на моем компьютере (PHP 5.3.8):

$tmp2 = '<?xml version="1.0"?><RWResponse><RESPONSE><DATA><HEADER><COLUMN>interval</COLUMN><COLUMN>name</COLUMN></HEADER></DATA></RESPONSE></RWResponse>';
$xml = new SimpleXMLElement($tmp2);
var_dump($xml);

// output:
object(SimpleXMLElement)#1 (1) {
  ["RESPONSE"]=>
  object(SimpleXMLElement)#2 (1) {
    ["DATA"]=>
    object(SimpleXMLElement)#3 (1) {
      ["HEADER"]=>
      object(SimpleXMLElement)#4 (1) {
        ["COLUMN"]=>
        array(2) {
          [0]=>
          string(8) "interval"
          [1]=>
          string(4) "name"
        }
      }
    }
  }
}

EDIT после обновления вопроса:

Это действительно должна быть ваша версия PHP, этоснова выводится на моей машине:

$tmp2 = '<?xml version="1.0"?><RWResponse><RESPONSE><DATA><HEADER><COLUMN>interval</COLUMN><COLUMN>name</COLUMN></HEADER></DATA></RESPONSE></RWResponse>';
$xml = simplexml_load_string($tmp2);
echo $xml->RESPONSE->DATA->HEADER->COLUMN[0];

// output:
interval
0 голосов
/ 30 августа 2011
$tmp2 = <<<XML<?xml version="1.0" standalone='yes'?>
<RWResponse>
 <RESPONSE>
  <DATA>
   <HEADER>
    <COLUMN>interval</COLUMN>
    <COLUMN>name</COLUMN>
   </HEADER>
  </DATA>
 </RESPONSE>
</RWResponse>
XML;

было бы реальным способом сделать это, поэтому, какой бы ввод XML не был, вы бы взяли и настроили его так, чтобы он выглядел больше так, чтобы это была не «строка», а фактически сформулированная информация XML.

0 голосов
/ 30 августа 2011
   $tmp2 = '<?xml version="1.0"?><RWResponse><RESPONSE><DATA><HEADER><COLUMN>interval</COLUMN><COLUMN>name</COLUMN></HEADER></DATA></RESPONSE></RWResponse>';

    $xml = simplexml_load_string($tmp2);
    var_dump($xml);
object(SimpleXMLElement)#1 (1) {
  ["RESPONSE"]=>
  object(SimpleXMLElement)#2 (1) {
    ["DATA"]=>
    object(SimpleXMLElement)#3 (1) {
      ["HEADER"]=>
      object(SimpleXMLElement)#4 (1) {
        ["COLUMN"]=>
        array(2) {
          [0]=>
          string(8) "interval"
          [1]=>
          string(4) "name"
        }
      }
    }
  }
}
0 голосов
/ 30 августа 2011

Вы можете попытаться подавить ошибки, а затем повторить их проверку, если вы можете исправить их, как объяснено ЗДЕСЬ , потому что я не вижу ошибки в примере XML.

...