具有 nusoap 响应的 SimpleXML

SimpleXML with nusoap response

我正在尝试从 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) { } 

欢迎提出任何建议!

您拥有的 PHP 代码实际上并没有骗您,而是按照您写下来的方式执行。评论一些细节可能对你有用:

$xml = simplexml_load_string($result);
if ($xml === false) {
    ...

如您所见,未触发 false 案例,因此加载 XML 成功。

然后你报告空洞的print_r简单XML元素输出。现在这有点不公平。您可能已经从观察中了解到 print_rvar_dump 在开发和调试代码时很有用。这是 尤其是 SimpleXMLElement 的情况下。在 general 中,这是不正确的,因为带有断点的步进调试器比放置 var_dump 要好得多print_r 暂时在您的代码中。

无论如何,对于SimpleXMLElement来说,它特别没有用。将您打开的 XML 文件与一个小数据库进行比较。例如,当您创建一个 PDO 对象与数据库交互并在其上使用 print_rvar_dump 时,您希望看到 数据库的全部内容 吗?我打赌你不会。这与 simplexml 类似。使用 print_r 不会显示 XML。它有时确实显示类似于 XML 结构的内容,但仅显示某些规则下的元素,这些规则可能非常具体。顺便说一句,这一直是一个很困惑的问题,这个问答中的一个经典是:

  • Accessing @attribute from SimpleXML

相反,查看 XML 本身,然后查询您要查找的数据。就像你一样。它甚至可以工作:https://eval.in/392059.