0

我有一个带有 xml 标头和 xml 代码的 php 文件,名为 test.php。

    <?php
header('Content-type: text/xml');

$file = file_get_contents('http://api.tradedoubler.com/1.0/vouchers.xml?token=removed');
echo $file;

?>

API 中的 xml 如下所示:

<voucherList>
  <voucher>
    <id>115</id>
    <programId>111</programId>
    <programName>Program 111</programName>
    <code>AF30C5</code>
    <updateDate>1332422674941</updateDate>
    <startDate>1332370800000</startDate>
    <endDate>1363906800000</endDate>
    <title>Voucher number one</title>
    <shortDescription>Short description of the voucher.</shortDescription>
    <description>This is a long version of the voucher description.</description>
    <voucherTypeId>1</voucherTypeId>
    <defaultTrackUri>http://clk.tradedoubler.com/click?a(222)p(111)ttid(13)</defaultTrackUri>
    <siteSpecific>True</siteSpecific>
  </voucher>
  <voucher>
    <id>116</id>
    <programId>111</programId>
    <programName>Program 111</programName>
    <code>F90Z4F</code>
    <updateDate>1332423212631</updateDate>
    <startDate>1332370800000</startDate>
    <endDate>1363906800000</endDate>
    <title>The second voucher</title>
    <shortDescription>Short description of the voucher.</shortDescription>
    <description>This is a long version of the voucher description.</description>
    <voucherTypeId>1</voucherTypeId>
    <defaultTrackUri>http://clk.tradedoubler.com/click?a(222)p(111)ttid(13)url(http://www.example.com/product?id=123)</defaultTrackUri>
    <siteSpecific>False</siteSpecific>
    <landingUrl>http://www.example.com/product?id=123</landingUrl>
  </voucher>
</voucherList>

如何将此文件加载为 xml?

以下不起作用:

$xml = simplexml_load_file('test.php');
echo $xml;

我只是得到一个白页。

测试文件保存为 php,因为它是动态的。它正在从 tradedoubler api 加载数据。

也许这是加载api数据的方式?

4

3 回答 3

0

simplexml_load_file() 将 xml 文件作为对象加载。如果你回显一个对象,它应该在输出中说“对象”。如果您得到一个白页,则很有可能出现问题(即:检查错误日志)。

您可以print_r($xml);查看 XML 对象的内容(如果设置正确)。

如果您从 print_r 语句获得输出,则可以开始访问特定节点和元素:

echo $xml->node[index]->element;

等等。

于 2012-11-15T22:58:04.150 回答
0

我刚刚尝试了您的示例源文件,print_r($xml);
我真的得到了输出。

所以请尝试print_r($xml)

我可以通过(例如,为我工作)访问您的 XML

$xml->voucher[0]->id;

那是因为 $xml 是一个对象,在这个对象里面有数组(比如凭证),在这个数组里面又有对象。

编辑:你改变了你的OP,所以:

我用 x.php 尝试了您的原始示例:

<?php

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

    $file = simplexml_load_file('test.php');
    echo $file->voucher[0]->id;

?>

在 test.php 我痛风你的 xml:

    <voucherList>
  <voucher>
    <id>115</id>
    <programId>111</programId>
    <programName>Program 111</programName>
    <code>AF30C5</code>
    <updateDate>1332422674941</updateDate>
    <startDate>1332370800000</startDate>
    <endDate>1363906800000</endDate>
    <title>Voucher number one</title>
    <shortDescription>Short description of the voucher.</shortDescription>
    <description>This is a long version of the voucher description.</description>
    <voucherTypeId>1</voucherTypeId>
    <defaultTrackUri>http://clk.tradedoubler.com/click?a(222)p(111)ttid(13)</defaultTrackUri>
    <siteSpecific>True</siteSpecific>
  </voucher>
  <voucher>
    <id>116</id>
    <programId>111</programId>
    <programName>Program 111</programName>
    <code>F90Z4F</code>
    <updateDate>1332423212631</updateDate>
    <startDate>1332370800000</startDate>
    <endDate>1363906800000</endDate>
    <title>The second voucher</title>
    <shortDescription>Short description of the voucher.</shortDescription>
    <description>This is a long version of the voucher description.</description>
    <voucherTypeId>1</voucherTypeId>
    <defaultTrackUri>http://clk.tradedoubler.com/click?a(222)p(111)ttid(13)url(http://www.example.com/product?id=123)</defaultTrackUri>
    <siteSpecific>False</siteSpecific>
    <landingUrl>http://www.example.com/product?id=123</landingUrl>
  </voucher>
</voucherList>

它仍然对我有用。因此,如果您仍然有空白页,则错误必须在其他地方。你error_reporting(E_ALL);开启了吗?

于 2012-11-15T23:00:24.063 回答
0

xml 文件加载正常,输出不为空,而只是一些新行。

尝试

echo $xml->asXML();

编辑:也许您的 php 配置阻止了外部 url 的 file_get_contents (allow_url_fopen = Off)。尝试使用 curl 或像这样的直接请求来获取它:

$xml = '';
$fp = fsockopen('api.tradedoubler.com', 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET /1.0/vouchers.xml?token=removed HTTP/1.1\r\n"
         . "Host: api.tradedoubler.com\r\n"
         . "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        $xml .= fgets($fp, 128);
    }
    fclose($fp);
}

if ($xml != '') {
    $xmlObject = simplexml_load_string($xml);
    if ($xmlObject) {
        // do something nasty! or just echo $xml->asXML();
    }
}
于 2012-11-15T23:05:48.010 回答