使用 SimpleXML 过滤掉项目


Filtering out items using SimpleXML

一直在环顾四周,被难住了。基本上,我正在尝试从 xml 提要中过滤出结果并将其隐藏在 html 输出中。我正在尝试找出场地"霍恩布洛尔游轮和活动",如果存在,请隐藏整个,这是所有节点的父级。

这是网址:http://www.sandiegomagazine.com/goldstartest/rss3-exclude.php

这是我的代码:

<?php
 $myfeed = simplexml_load_file('https://www.goldstar.com/api/listings.xml?api_key=6d0d598c69dfecfcf028b0d2b3c9b693b606ad8c&postal_code=92101');
 $i = 0;
foreach ($myfeed as $goldstar): 
    $title=$goldstar->headline_as_html; 
    $summary=$goldstar->summary_as_html; 
    $dates=$goldstar->upcoming_dates->event_date->date; 
    $ourprice=$goldstar->our_price_range; 
    $fullprice=$goldstar->full_price_range; 
    $img=$goldstar->image; 
    $link=$goldstar->link; 
    $venue_name=$goldstar->venue->name;
    $venue_street=$goldstar->venue->address->street_address;
    $venue_locality=$goldstar->venue->address->locality;
    $venue_region=$goldstar->venue->address->region;
    $venue_zip=$goldstar->venue->address->postal_code;
    $venue_phone=$goldstar->venue->phone;
    $category=$goldstar->category_list->category->name;

   // if ($venue_name == 'Hornblower Cruises and Events'){
     // unset($myfeed->event);
        //echo $myfeed->asxml();
    //}
    if (++$i > 20) {
    // stop after 10 loops
    break;
}

?>
<html>
<head></head>
<body>



<div class="gs-item">
<div class="gs-itemcontent">
<h3 class="gs-cat"><?php echo $category; ?></h3>
<h2><a href="<?php echo $link; ?>" target="_blank"><?php echo $title; ?></a></h2>
<h4 class="gs-date">Date: <?php echo $dates; ?> <br/>For more show dates, <a href="<?php echo $link; ?>" target="_blank">click here</a></h4>
<img src="<?php echo $img; ?>" />
<p><?php echo $summary; ?></p>

<div id="gs-callout">
<span class="fullprice">Full Price: <?php echo $fullprice; ?></span>
<br/>
<span class="ourprice">Our Price:  <span class="gs-hilite"><?php echo $ourprice; ?></span></span>
 <p><a class="gs-button" href="<?php echo $link; ?>" target="_blank">Buy Tickets &raquo;</a></p>
</div>

<ul class="gs-venue">
<li><strong><?php echo $venue_name; ?></strong> | </li>
<li><?php echo $venue_street; ?></li>
<li><?php echo $venue_locality; ?>, <?php echo $venue_region; ?> <?php echo $venue_zip; ?></li>
<li><?php echo $venue_phone; ?></li>

</ul> 
</div>
<div class="gs-clear"></div>
</div>



    <?  endforeach; ?>

</body>

帮助?

使用键控 foreach

 foreach ($myfeed as $key => $goldstar):

然后使用键取消设置整个当前 xml

unset($myfeed->$key);

或者取消设置场地与未设置($myfeed->$key->场地(;

或者,您可以只构建一个新的 obj,而不是尝试编辑现有的 obj。在循环之前实例化一个新对象,然后只向其中添加要保留的部分。

或者,如果您找到不需要的场地,您可以继续 foreach 。 唯一的缺点是你不会在$myfeed中拥有你的ok'd列表的副本。 所以。。。

if ($venue_name == 'Hornblower Cruises and Events') { continue; }
首先,

您应该将从 SimpleXML 对象获取的每个对象强制转换为相关类型。例如,您应该在读取字段之前使用放置(string)强制转换字符串属性或节点:

$venue_name = (string)$goldstar->venue->name

对于您关于过滤的问题,我建议您自己继续查找匹配字符串,然后决定是否添加。

编辑

您正在尝试查看场地名称是否'Hornblower Cruises and Events'然后取消设置当前事件字段并将其回显为 XML?首先,您应该编写unset($myfeed)因为它是事件字段本身。接下来,如果您取消设置$myfeedasxml将不会返回任何内容。而且你的代码HTML错误。在for的每个循环中,您都在编写:

<html>
<head></head>
<body>

您应该将它们放在for之前。而且它们没有结束标签。将结束标记放在 for 之后。如果您只想获取没有场地名称'Hornblower Cruises and Events'字段,请将<?php if($venue_name != 'Hornblower Cruises and Events') : ?>放在<div class="gs-item">之前,<?php endif; ?>放在</ul>之后。