XML解析和foreach结构

时间:2013-08-10 15:28:47

标签: php xml xml-parsing foreach

我是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>

为了简洁起见,我没有把我尝试过的所有东西都放进去。将有一个制造商项目,它将是一个常数。将有多个经销商ID,每个经销商可能有多个dealer_item(s)但总是至少有一个。我不知道用于获取我需要的东西的构造。 dealer_logo来自经销商,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中打开它并将其保存到磁盘时,我看到&amp ;.我还改变了我提供它的URL以获得&amp;但仍然没有。以下是与我目前完全相同的代码:

<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中打开它并将其保存到磁盘时,我看到了&符号的编码版本。

编辑发布错误: [2013年8月12日星期一20:32:06] [错误] [客户端204.181.48.224] PHP警告:simplexml_load_string():实体:第1行:解析器错误:期望开始标记,'&lt;'在第32行的/home/sites/staging.clearblueeasy.com/website/m/advanced-digital-ovulation-test-buyonline.php中找不到 [2013年8月12日20:32:06] [错误] [客户端204.181.48.224] PHP警告:simplexml_load_string():{/ 3}} /home/sites/staging.clearblueeasy.com/website/m/advanced-第32行的digital-ovulation-test-buyonline.php [2013年8月12日星期一20:32:06] [错误] [客户端204.181.48.224] PHP警告:simplexml_load_string():^ / inhome/sites/staging.clearblueeasy.com/website/m/advanced-digital-ovulation-第32行的test-buyonline.php [2013年8月12日星期一20:32:06] [错误] [客户端204.181.48.224] PHP警告:在/home/sites/staging.clearblueeasy.com/website/m/advanced-digital-中为foreach()提供的参数无效第34行排卵试验-iceonline.php [2013年8月12日星期一20:32:06] [错误] [客户端204.181.48.224] PHP警告:在/home/sites/staging.clearblueeasy.com/website/m/advanced-digital-中为foreach()提供的参数无效第40行排卵试验 - 购买线.php

1 个答案:

答案 0 :(得分: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; ?>

修改:Codepad Demo

确保您的XML有效。查看XML中的URL,它们包含无效的原始&。您需要将它们编码为&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; ?>