我是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&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
答案 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,它们包含无效的原始&
。您需要将它们编码为&
。在演示中,我更改了它们,以便您可以看到代码正常工作。
编辑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; ?>