我正在尝试从Web服务结果中解析XML,但我失败了。结果似乎是有效的,因为我打印它,它显示我需要的所有数据。
print_r($result);
给我:
<?xml version="1.0" encoding="utf-8"?><retorno> <versao>1.00</versao> <versaodados>1.00</versaodados> <codigoconvenio>S2111601391F5530F0250A</codigoconvenio> <codigoretorno>0</codigoretorno> <mensagens> <mensagem>Sucesso</mensagem> </mensagens> <dados> <dado><identificadorfatura>1000219113262</identificadorfatura><mesanoreferencia>ABR/2015</mesanoreferencia><datavencimento>2015-06-07</datavencimento><valorfatura>239.72</valorfatura></dado> </dados></retorno>
现在,我需要获取“codigoretorno”标签内容,我正在尝试考虑“retorno”将是根标签:
$xml = simplexml_load_string($result);
if ($xml === false) {
echo "Failed loading XML: ";
foreach(libxml_get_errors() as $error) {
echo "<br>", $error->message;
}
} else {
echo 'Codigo Convenio: ';
echo $xml->codigoconvenio;
}
给我没有错误,只打印“Codigo Convenio:”,没有任何跟随。当我尝试:
print_r($xml);
我明白了:
SimpleXMLElement Object ( )
还有:
var_dump($xml);
输出结果为:
object(SimpleXMLElement)#5 (0) { }
欢迎任何建议!
答案 0 :(得分:1)
你实际上的PHP代码并不是骗你的,也不是你写下来的。您可能对某些细节发表评论很有用:
$xml = simplexml_load_string($result);
if ($xml === false) {
...
正如您所观察到的,false
案例未被触发,因此加载XML成功。
然后报告空白的print_r SimpleXMLElement输出。现在这有点不公平。您可能从观察中了解到print_r
和var_dump
在开发和调试代码时非常有用。在SimpleXMLElement
的情况下, 尤其不是。在 general 中,情况并非如此,因为带有断点的步进调试器远远优于放置 var_dump
或 print_r
暂时在你的代码中。
无论如何,对于 SimpleXMLElement ,它特别没用。将您使用的XML文件与一个小数据库进行比较。例如,当您创建PDO对象以与数据库交互并在其上使用 print_r
或 var_dump
时,您是否希望看到< em>数据库的全部内容?我打赌你不会。这与simplexml类似。使用print_r
不会向您显示XML。它有时会显示类似于XML结构的东西,但只显示某些规则下的元素,这些元素可能非常具体。顺便说一句,这一直是一个令人讨厌的问题,这个Q&amp; A的经典之作是:
相反,请查看XML本身,然后查询您要查找的数据。就像你做的那样。它甚至可以工作:https://eval.in/392059。