使用PHP foreach使用SimpleXML将多个嵌套元素解析为无序列表

时间:2016-11-03 09:35:52

标签: php xml parsing simplexml

我正在使用XML产品列表,该列表显示大约20种产品的列表,并且在每个<item>内,每个产品都有一个<description>,然后一个<bullet>。这是一个例子:

XML File with <bullet> List

我使用带有SimpleXML的foreach循环来提取产品数据,并且<image><title>等所有单个标记都正常运行。

我的问题是它只解析每个产品的第一个<bullet>而不是所有产品。为了解决这个问题,我尝试添加一个for循环,该循环定位<description>标记内的所有嵌套项,然后输出很多。 但是现在它给了我XML文件中第一个项目的第一个<bullet>并将其放在每个产品下,而不是为每个产品显示多个项目符号,这就是我想要的。

我会发布我的剧本,希望有人能够指出我出错的地方。

<?php
$items = simplexml_load_file('http://www.itclear.com/BestSellers.xml');

foreach ($items->channel->item as $item):
    $title=$item->title;
    $image=$item->image;
    $price=$item->price;
    $description=$item->description;
    $link=$item->link;

    echo '
             <div class="xsmall-12 medium-6 large-4 columns product">
                <div class="inner">
                    <div class="product-image">
                        <img class="product-image" src="',$image,'"/>
                    </div>
                <h2 class="product-title"><strong>',$title,'</strong></h2>

                <ul>';

    $bullets = $items->channel->item->description;
    for($i=0;$i<=$bullets;$i++){
        echo '<li>',$bullets[$i]->bullet,'</li>';
    }

    echo'
               </ul><span class="product-price">&pound;',$price,'</span>
                <a class="product-link" href="',$link,'" target="_blank" title="Visit ITC Sales to buy ',$title,'">View Deal <i class="fa fa-angle-right" aria-hidden="true"></i></a>
             </div>
         </div>';
    endforeach;

&GT;

Rendered HTML & CSS

2 个答案:

答案 0 :(得分:1)

你的问题在于这一行:

$bullets = $items->channel->item->description;

此行未提及您在外部foreach循环中循环的元素,因此无法知道您要查看哪个item。它只是说&#34;查看文档中的第一个<channel>,然后查看其中的第一个<item>,然后查看其中的<description>元素&#34;。< / p>

您想要的是使用循环中定义的$item变量,并查看<description>元素那里

$bullets = $item->description;

但是这个变量名称并不完全正确 - $bullets变量现在包含一个或多个<description>元素,而不包含其下的<bullet>元素。所以我们应该说:

$description = $item->description;
$bullets = $description->bullet;

请注意,我们现在不需要$bullets[$i]->bullet,因为$bullets[$i]应该已经是<bullet>元素;你还需要count()你的代码中缺少的项目符号。所以我们有:

for($i=0;$i<=count($bullets);$i++){
    echo '<li>',$bullets[$i],'</li>';
}

为简化这一切,您可以使用文件顶部已有的foreach循环样式:

foreach ( $item->description->bullet as $bullet ) {
    echo '<li>',$bullet,'</li>';
}

答案 1 :(得分:0)

我还为那些也遇到类似问题的人找到了另一种解决方案。这是代码:

    <?php

        $xml = 'http://www.itclear.com/BestSellers.xml';

        $items = simplexml_load_file($xml);

        foreach ($items->channel->item as $item) {

            $title = $item->title;
            $image=$item->image;
            $price=$item->price;
            $description=$item->description;
            $link=$item->link;

            echo '
             <div class="xsmall-12 medium-6 large-4 columns product">
                <div class="inner">
                    <div class="product-image">
                        <img class="product-image" src="',$image,'"/>
                    </div>
                <h2 class="product-title"><strong>',$title,'</strong></h2>

                <ul class="product-description">';

            foreach ($item->description->bullet as $bullet) {
                echo '<li>';
                $b = $bullet;
                echo $b;
                echo "</li>";

            }


            echo'
               </ul><span class="product-price">&pound;',$price,'</span>
                <a class="product-link" href="',$link,'" target="_blank" title="Visit ITC Sales to buy ',$title,'">View Deal <i class="fa fa-angle-right" aria-hidden="true"></i></a>
             </div>
         </div>';

        }

    ?>