使用xml标头加载php文件

时间:2012-11-15 22:49:52

标签: php xml

我有一个带有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数据加载的方式?

3 个答案:

答案 0 :(得分:0)

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

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

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

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

等等。

答案 1 :(得分: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);开启吗?

答案 2 :(得分:0)

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

echo $xml->asXML();

编辑: 也许你的php配置会阻止外部网址的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();
    }
}