【问题标题】:parsing XML from curl (mobile.de API) won't work从 curl (mobile.de API) 解析 XML 不起作用
【发布时间】:2018-12-03 20:59:11
【问题描述】:

那里,

我想创建一个主页并在其上自动显示 mobile.de 的广告。 为此,mobile.de 提供了一个 API: https://services.mobile.de/manual/search-api.html

我有权访问数据,当我通过浏览器开始通话时: https://services.mobile.de/search-api/search?customerNumber=503300

我得到这个结果:

<search:search-result xmlns:seller="http://services.mobile.de/schema/seller" xmlns:ad="http://services.mobile.de/schema/ad" xmlns:search="http://services.mobile.de/schema/search" xmlns:financing="http://services.mobile.de/schema/common/financing-1.0" xmlns:resource="http://services.mobile.de/schema/resource" xmlns:error="http://services.mobile.de/schema/common/error-1.0">
<search:total>4</search:total>
<search:page-size>20</search:page-size>
<search:current-page>1</search:current-page>
<search:max-pages>1</search:max-pages>
<search:ads>
<ad:ad key="266399529" url="https://services.mobile.de/search-api/ad/266399529">
<ad:creation-date value="2018-11-19T07:53:58+01:00"/>
<ad:modification-date value="2018-11-19T07:53:58+01:00"/>
<ad:detail-page url="https://suchen.mobile.de/auto-inserat/porsche-997-gt3-rs-ruf-4-0-einzelst%C3%BCck-allrad-solms/266399529.html?source=api"/>
<ad:vehicle>

我觉得不错! 现在我想通过个别广告和有问题。 各个广告按此行分组:

<ad:ad key="266399529" url="https://services.mobile.de/search-api/ad/266399529">

通过我多年的经验,尤其是通过互联网,我得出了以下代码:

        error_reporting(E_ALL);
    ini_set('display_errors', true);
    $process = curl_init("https://services.mobile.de/search-api/search?customerNumber=503300"); 
    curl_setopt($process, CURLOPT_HTTPHEADER, array('Content-Type: application/xml')); 
    curl_setopt($process, CURLOPT_HEADER, 0); 
    curl_setopt($process, CURLOPT_USERPWD, "username:password"); 
    curl_setopt($process, CURLOPT_TIMEOUT, 30); 
    curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE); 
    $return = curl_exec($process); 
    curl_close($process);  
    $xml = simplexml_load_string($return);
    $ns = $xml->children('http://services.mobile.de/schema/ad');
    foreach($ns as $ad) {
        $attributes = $ad->attributes();
        $key = (string) $attributes['key'];

        var_dump($key);
    }  

不幸的是,我没有得到任何答案,一个没有错误消息的空白页面。

【问题讨论】:

  • 如果这是完整的响应,我认为这不是有效/完整的 XML
  • 我刚刚发布了xml文件的开头。
  • 如果我们没有有效的数据可以使用,我们应该如何调试呢?

标签: php xml api curl


【解决方案1】:

问题是您的根节点和&lt;ad:ad&gt; 元素之间还有另一个元素。您需要通过&lt;search:ads&gt; 元素...

$ns = $xml->children('http://services.mobile.de/schema/search')->ads
    ->children('http://services.mobile.de/schema/ad');

要访问广告的详细信息,您需要再次查看结构​​并查看您想要的元素以及它们所在的命名空间。因此,对于每个广告的类别元素的文本,您可以使用循环和...

$ns = $xml->children('http://services.mobile.de/schema/search')->ads
    ->children('http://services.mobile.de/schema/ad');

foreach($ns as $ad) {
    foreach ( $ad->vehicle as $vehicle )    {
        echo (string)$vehicle->category[0]
            ->children("http://services.mobile.de/schema/resource")
            ->{'local-description'}.PHP_EOL;
    }
}  

其中两件事是 &lt;resource:local-description&gt; 元素位于不同的命名空间中,这就是为什么它将 -&gt;children() 与另一个命名空间一起使用。此外,由于名称包含-,您必须使用-&gt;{'local-description'} 访问它才能使其成为有效名称。

最后 - 由于所有这些都将返回它指向的元素,你应该将它转换为一个字符串(在开头使用 (string))以确保你最终只得到元素中的文本。

【讨论】:

  • 谢谢,它有效。但是我现在如何访问子元素?我想访问每个现有“ad-key”(即每个广告)的子组“ad:vehicle”,然后再访问子元素“ad:category”。我想读出这一行并取回字符串“Sportscar/Coupé”作为值。这是 xml 文件的链接 -> senzel.boehm-it-service.de/search.xml
  • 我添加了一些新代码来提取resource:local-description 元素,如果您遵循此模式,您应该能够获得所需的所有数据。
【解决方案2】:

作为替代方案,您也可以使用带有命名空间前缀的 xpath 表达式:

//search:search-result/search:ads/ad:ad

例如:

$ads = $xml->xpath('//search:search-result/search:ads/ad:ad');
foreach ($ads as $ad) {
    $key = (string)$ad->attributes()->key;
}

【讨论】:

  • 您的解决方案也有效,非常感谢。但是这里我也有同样的问题,不知道怎么访问xml树中的子元素。见我上面的回答。
  • 这还能用吗?我试图 var_dump $ads 但它只返回“bool(false)”
猜你喜欢
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 2012-08-06
  • 2014-02-02
  • 1970-01-01
相关资源
最近更新 更多