具有 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_r
和 var_dump
在开发和调试代码时很有用。这是 尤其是 在 SimpleXMLElement
的情况下。在 general 中,这是不正确的,因为带有断点的步进调试器比放置 var_dump
或 要好得多print_r
暂时在您的代码中。
无论如何,对于SimpleXMLElement来说,它特别没有用。将您打开的 XML 文件与一个小数据库进行比较。例如,当您创建一个 PDO 对象与数据库交互并在其上使用 print_r
或 var_dump
时,您希望看到 数据库的全部内容 吗?我打赌你不会。这与 simplexml 类似。使用 print_r
不会显示 XML。它有时确实显示类似于 XML 结构的内容,但仅显示某些规则下的元素,这些规则可能非常具体。顺便说一句,这一直是一个很困惑的问题,这个问答中的一个经典是:
- Accessing @attribute from SimpleXML
相反,查看 XML 本身,然后查询您要查找的数据。就像你一样。它甚至可以工作:https://eval.in/392059.
我正在尝试从 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_r
和 var_dump
在开发和调试代码时很有用。这是 尤其是 在 SimpleXMLElement
的情况下。在 general 中,这是不正确的,因为带有断点的步进调试器比放置 var_dump
或 要好得多print_r
暂时在您的代码中。
无论如何,对于SimpleXMLElement来说,它特别没有用。将您打开的 XML 文件与一个小数据库进行比较。例如,当您创建一个 PDO 对象与数据库交互并在其上使用 print_r
或 var_dump
时,您希望看到 数据库的全部内容 吗?我打赌你不会。这与 simplexml 类似。使用 print_r
不会显示 XML。它有时确实显示类似于 XML 结构的内容,但仅显示某些规则下的元素,这些规则可能非常具体。顺便说一句,这一直是一个很困惑的问题,这个问答中的一个经典是:
- Accessing @attribute from SimpleXML
相反,查看 XML 本身,然后查询您要查找的数据。就像你一样。它甚至可以工作:https://eval.in/392059.