0

我是 XML 解析的新手,但对 php 和 html 并不陌生。我需要解析以下 XML 结构:

<er_data service="pl">
    <manufacturer_item>
        <item_id></item_id>
        <model></model>
        <manufacturer></manufacturer>
        <product_name></product_name>
        <description></description>
        <datasheeturl/>
        <image_url/>
        <map></map>
    </manufacturer_item>
    <dealers>
        <dealer id="111">
            <dealer_logo>http:/source.com/images/vendors/90x60/111.gif</dealer_logo>
            <dealer_name></dealer_name>
            <dealer_url></dealer_url>
        </dealer>
        <dealer id="222">
            <dealer_logo>http:/source.com/images/vendors/90x60/222.gif</dealer_logo>
            <dealer_name></dealer_name>
            <dealer_url></dealer_url>
        </dealer>
    </dealers>
    <dealer_item>
        <dealer_id>111</dealer_id>
        <dealer_sku></dealer_sku>
        <model></model>
        <manufacturer></manufacturer>
        <name></name>
        <price></price>
        <availability></availability>
        <image_url></image_url>
        <buy_url>http://source.com/c/?nVID=111&rsSku=321321</buy_url>
    </dealer_item>
    <dealer_item>
        <dealer_id>222</dealer_id>
        <dealer_sku></dealer_sku>
        <model></model>
        <manufacturer></manufacturer>
        <name></name>
        <price></price>
        <availability></availability>
        <image_url></image_url>
        <buy_url>http://source.com/c/?nVID=222&rsSku=654654</buy_url>
    </dealer_item>
    <loggingpixel></loggingpixel>
</er_data>

并创建一个输出 html 的 foreach,如下所示:

<tr>
    <td><img src=$dealer_logo></td>
<td><a href=$buy_url>Buy Online</a></td>
</tr>

为简洁起见,我并没有把我尝试过的所有东西都放进去。将有一个制造商项目,它将是一个常数。会有多个dealer id (s) 并且每个dealer 可以有多个dealer_item (s) 但总是至少有一个。我不知道用来获取我需要的东西的构造。Dealer_logo 来自dealers,buy_url 来自dealer_items。请注意,徽标 URL 中将包含经销商 ID 号。

为简洁起见,我不会展示我尝试过的所有新手的东西。基本上,我使用这样的结构进行读取和循环:

$retailers = simplexml_load_file("http://source.com/xml.asp");

foreach ($retailers->dealer_items as $storeinfo):
endforeach;

任何帮助将不胜感激!抱歉,XML 没有正确缩进。凯伦编辑 MrCode- 我仍然一无所获。XML 文件在其他人的控制之下,但是当我在 Safari 中打开它并将其保存到磁盘时,我看到了 &。我还更改了我提供给它的 URL,使其具有 & 但仍然没有。这是我目前拥有的代码:

<table class="gridtable">
<tr>
    <th>Retailer</th>
    <th>In Stock</th>
    <th></th>
    </tr>

<?php   
$retailers = simplexml_load_string('http://pg.links.channelintelligence.com/pages/plxml.asp?sSKU=633472600401&amp;nRGID=4938');
$dealers = array();
foreach($retailers->dealers->dealer as $dealer)
{
$dealers[(int)$dealer->attributes()->id] = array('dealer_logo' => (string)$dealer->dealer_logo);
}
?>

<?php foreach($retailers->dealer_item as $item): ?>
<tr>
<td><img src="<?php echo $dealers[(int)$item->dealer_id]['dealer_logo']; ?>"></td>
<td>Yes</td>
<td><a href="<?php echo (string)$item->buy_url; ?>">Buy Online</a></td>
</tr>
<?php endforeach; ?>

</table>

编辑(在论坛上为格式化而苦苦挣扎) *XML 文件在其他人的控制之下,但是当我在 Safari 中打开它并将其保存到磁盘时,我看到了 & 符号的编码版本。

编辑发布错误:[Mon Aug 12 20:32:06 2013] [error] [client 204.181.48.224] PHP Warning: simplexml_load_string(): Entity: line 1: parser error: Start tag expected, '<' not found in /home/sites/staging.clearblueeasy.com/website/m/advanced-digital-ovulation-test-buyonline.php 第 32 行 [2013 年 8 月 12 日星期一 20:32:06] [错误] [客户端 204.181.48.224] PHP警告:simplexml_load_string():http ://pg.links.channelintelligence.com/pages/plxml.asp?nrgid=4938&ssku=63347260在 /home/sites/staging.clearblueeasy.com/website/m/advanced-digital-ovulation-test-buyonline.php 第 32 行 [2013 年 8 月 12 日星期一 20:32:06] [错误] [客户端 204.181.48.224] PHP 警告:simplexml_load_string(): ^ in /home/sites/staging.clearblueeasy.com/website/m/advanced-digital-ovulation-test-buyonline.php 第 32 行 [2013 年 8 月 12 日星期一 20:32:06] [错误] [客户端 204.181.48.224] PHP 警告:第 34 行的 /home/sites/staging.clearblueeasy.com/website/m/advanced-digital-ovulation-test-buyonline.php 中的 foreach() 提供的参数无效 [周一2013 年 8 月 12 日 20:32:06] [错误] [客户端 204.181.48.224] PHP 警告:在 /home/sites/staging.clearblueeasy.com/website/m/advanced-digital-ovulation- 中为 foreach() 提供的参数无效-第 40 行的 test-buyonline.php

4

1 回答 1

0

因为您在 XML 中单独定义了经销商,所以您需要先提取经销商,以便您可以dealer_logo根据以下 ID查找dealer_item

<?php
// assume $retailers is the xml object
$dealers = array();
foreach($retailers->dealers->dealer as $dealer)
{
    $dealers[(int)$dealer->attributes()->id] = array('dealer_logo' => (string)$dealer->dealer_logo);
}
?>

<?php foreach($retailers->dealer_item as $item): ?>
<tr>
    <td><img src="<?php echo $dealers[(int)$item->dealer_id]['dealer_logo']; ?>"></td>
    <td><a href="<?php echo (string)$item->buy_url; ?>">Buy Online</a></td>
</tr>
<?php endforeach; ?>

编辑:键盘演示

确保您的 XML 有效。查看您在 XML 中的 URL,它们包含&无效的 raw。您需要将它们编码为&amp;. 在演示中,我更改了它们,以便您可以看到代码正常工作。

编辑2:最终代码

<?php

$retailers = simplexml_load_file('http://pg.links.channelintelligence.com/pages/plxml.asp?sSKU=633472600401&nRGID=4938');

$dealers = array();
foreach($retailers->dealers->dealer as $dealer)
{
    $dealers[(int)$dealer->attributes()->id] = array('dealer_logo' => (string)$dealer->dealer_logo);
}

?>

<?php foreach($retailers->dealer_items->dealer_item as $item): ?>
<tr>
    <td><img src="<?php echo $dealers[(int)$item->dealer_id]['dealer_logo']; ?>"></td>
    <td><a href="<?php echo (string)$item->buy_url; ?>">Buy Online</a></td>
</tr>
<?php endforeach; ?>
于 2013-08-10T16:14:33.913 回答