2013-08-10 3 views
0

Я новичок в разборе XML, но не новичок в php и html. Мне нужно разобрать следующую структуру XML:XML-синтаксический анализ и структура foreach

<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, как это:

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

Для краткости я не класть все вещи, которые я пробовал. Будет один элемент производителя, и он будет постоянным. Будет несколько идентификаторов дилера, и у каждого дилера может быть несколько идентификаторов дилера, но всегда будет иметь хотя бы один. Я не знаю, какие конструкции использовать, чтобы получить то, что мне нужно. Дилер_logo выходит из дилеров, а buy_url выходит из дилера. Обратите внимание, что URL-адрес логотипа будет содержать номер идентификатора продавца.

Для краткости я не буду показывать все новички, которые я пробовал. В основном, я использую структуру, как это для чтения и зацикливание:

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

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

Любая помощь будет принята с благодарностью! Извините, что XML не имеет отступов должным образом. Karen Редактировать 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> 

редактировать (strugging с форматированием на форуме) * Файл XML находится под чьим-то контролем, но когда я открываю его в Safari и сохранить его на диске, я вижу закодированная версия амперсанда.

Редактировать записи: [Mon Aug 12 20:32:06 2013] [error] [client 204.181.48.224] PHP Предупреждение: simplexml_load_string(): Entity: строка 1: ошибка парсера: ожидается начальный тег, < 'не найдена в /home/sites/staging.clearblueeasy.com/website/m/advanced-digital-ovulation-test-buyonline.php в строке 32 [пн 12 авг 20:32:06 2013] [ошибка] [ клиент 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 [Пн Авг 12 20: 32:06 2013] [error] [client 204.181.48.224] PHP Предупреждение: simplexml_load_string():^в /home/sites/staging.clearblueeasy.com/website/m/advanced-digital-ovulation-test-buyonline.php on строка 32 [Mon Aug 12 20:32:06 2013] [error] [client 204.181.48.224] PHP Предупреждение: неверный аргумент, предоставленный foreach() в /home/sites/staging.clearblueeasy.com/website/m/advanced-digital -ovulation-test-buyonline.php on line 34 [Mon Aug 12 20:32:06 2013] [error] [client 204.181.48.224] PHP Предупреждение: неверный аргумент для foreach() в/home/sites/staging. clearblueeasy.com/website/m/advanced-digital-ovulation-test-buyonline.php в строке 40

+0

Так в чем проблема? Вы знаете, как делать. Вы знаете, как пройти SimpleXml. Просто получите нужные данные и напишите в свои строки HTML. – Gordon

+0

'$ retailers-> dealer_items' должен быть' $ ритейлерами-> dealer_item' оттуда вы обычно можете прочитать остальное, в чем проблема? – Prix

ответ

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 действителен. Взгляните на свои URL-адреса в XML, они содержат необработанный &. Вам необходимо закодировать их в &amp;. В демоверсии я изменил их, чтобы вы могли видеть, как работает код.

Edit 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; ?> 
+0

Г-н Кодекс, который выглядит элегантно для меня, и это проблема - дилеры определяются отдельно. Но я ничего не могу заселить. Я не хочу игнорировать очевидное - определить $ ритейлеров, которые я использую: Я попытался поставить статическое изображение на логотип и просто потянуть buy_url, и я тоже ничего не получаю. Thx, Karen – Karen

+0

@Karen, см. Мою редакцию - добавлена ​​демоверсия. Не забудьте закодировать '&' в '&' в XML или SimpleXML не сможет его проанализировать. – MrCode

+0

см. Мое редактирование. Спасибо за демо. Мне жаль, что я все еще не могу заставить его работать. – Karen