【问题标题】:PHP cURL response as XML is shown as plain string作为 XML 的 PHP cURL 响应显示为纯字符串
【发布时间】:2018-03-07 15:29:09
【问题描述】:

如果我在浏览器上运行此链接,我会得到正确的 XML 格式响应:http://old.lb.lt/webservices/FxRates/FxRates.asmx/getCurrentFxRates?tp=EU

现在,如果我使用 cURL 对同一链接运行 POST 请求,并且当我转储响应时,我只会得到一个字符串。如果我做

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

然后响应显示在我的浏览器中,没有 XML 标记,但是如果我检查页面,我会看到所有 XML 标记,并且看起来不错。

我可以做些什么来解析这个包含所有 XML 标记的有效响应到变量?

我也将响应设置为:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/x-www-form-urlencoded'
));

如文档http://www.lb.lt/webservices/FxRates/FxRates.asmx?op=getCurrentFxRates 中所述(在页面的最底部)。

【问题讨论】:

  • 响应没有任何问题,您只是将其显示为 HTML - 这就是为什么当您检查页面时它在其中包含标签的原因。你认为你有什么问题?
  • 您的浏览器将直接 url 解释为 xml 并将其格式化以供人类阅读。在 PHP 中,它将内容抓取到字符串中并使用默认标题输出。您需要使用库或类将字符串转换为 XML 对象进行操作。或者在输出到浏览器之前设置输出header('Content-Type: text/xml');

标签: php curl post


【解决方案1】:

您可以使用simplexml_load_string() 将您的字符串转换为 XML 对象:

$xmlstring = curl_exec($ch); 
$xml = simplexml_load_string($xmlstring);
foreach ($xml->FxRate as $rate) {
   echo (string)$rate->Tp ;
}

【讨论】:

    【解决方案2】:

    当我转储响应时,我只得到一个字符串

    是的,anything 通过 HTTP 的输出是一串字节。在这种情况下,该字符串就是 XML 文档的内容。

    然后响应显示在我的浏览器中,没有 XML 标记

    这是因为 PHP 默认告诉浏览器将其输出解释为 HTML;当浏览器将 XML 解释为 HTML 时,它会简单地忽略所有无法识别的标签,并输出它们之间的任何内容。

    您可以使用htmlspecialchars() 对 HTML 文档中的 XML 进行编码,或者通过设置内容类型标头指示浏览器将其解释为 XML:

    header('Content-Type: text/xml');
    

    如果我检查页面,我会看到所有 XML 标记,而且看起来不错。

    浏览器中的“查看源代码”视图或 DOM 检查器仍在将内容解释为 HTML,但旨在显示所有标签(已识别的标签,如 <div><p>,以及无法识别的标签,如 <some-xml-tag> )。

    我可以做些什么来解析这个包含所有 XML 标记的有效响应到变量?

    嗯,这取决于你想要它在什么类型的变量中;如果我们想从字面上理解这个问题,那么您拥有的字符串是一个包含 XML 的变量。

    您最有可能寻找的是一个 XML 解析器,它可以让您从 XML 中获取一些数据并在 PHP 中对其进行处理,最简单的解析器被恰当地称为 SimpleXML ,你可以找到basic examples for using it in the PHP manual

    (请不要试图将整个 XML 文档转换为数组 - XML 的结构不太适合简单数组,SimpleXML 旨在为您很好地应对这种复杂性;它做得很好,一旦你习惯了。)

    我也将响应设置为:

    curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/x-www-form-urlencoded' ));

    这与响应没有任何关系;它正在向 API 发送一个 HTTP 标头,指定您要发送的数据的格式;具体来说,您以提交 HTML 表单时浏览器将使用的格式发送它。

    【讨论】:

    • 嗯,问题。我发送给解析器的数据应该已经是 XML 格式的,目前我没有这样的数据。我得到的所有响应都是一个纯字符串,如下所示:prnt.sc/io4pnl
    • @The50 那是您的浏览器将字符串解释为 HTML,当您将其传递给解析器时,您的浏览器不会参与其中。如果在查看源代码时它看起来正确,那么字符串本身就很好。
    • @The50 请重新阅读此处提供的信息。停止查看 Web 浏览器窗口中的输出。
    • 谢谢,问题已解决。只需将响应数据直接放入解析器并获取具有所有值的对象即可。 ( $parse = new SimpleXMLElement($data); )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多