我正在从国家数据浮标中心解析PHP的RSS源。我无法解析标记为CDATA的描述。最终目标是拥有描述项变量,如位置,风向,风速等。我不确定如何解决这个问题并省略 标签。
以下是Feed的摘录:
<item>
<pubDate>Thu, 08 Sep 2011 17:59:39 UT</pubDate>
<title>Station SFXC1 - SAN FRANCISCO BAY RESERVE, CA</title>
<description><![CDATA[
<strong>September 8, 2011 9:45 am PDT</strong><br />
<strong>Location:</strong> 38.223N 122.026W or 77 nautical miles S of search location of 39.5N 122.1W.<br />
<strong>Wind Direction:</strong> W (270°)<br />
<strong>Wind Speed:</strong> 11 knots<br />
<strong>Atmospheric Pressure:</strong> 30.03 in (1017.0 mb)<br />
<strong>Air Temperature:</strong> 62°F (16.9°C)<br />
<strong>Dew Point:</strong> 50°F (10.2°C)<br />
]]></description>
<link>http://www.ndbc.noaa.gov/station_page.php?station=sfxc1</link>
<guid>http://www.ndbc.noaa.gov/station_page.php?station=sfxc1&ts=1315500300</guid>
<georss:point>38.223 -122.026</georss:point>
</item>
这是PHP:
$feed_url = "http://www.ndbc.noaa.gov/rss/ndbc_obs_search.php?lat=39.5&lon=-122.1&radius=400";
$xmlString = file_get_contents($feed_url);
$xmlString = str_replace('georss:point','point',$xmlString);
$xml = new SimpleXMLElement($xmlString);
$items = $xml->xpath('channel/item');
$closeItems = array();
$new_array = array();
foreach($items as &$item)
{
echo "<br>";
$item_title = $item->title;
$item_title = mb_convert_case($item_title, MB_CASE_UPPER, "UTF-8");
list($lat, $lng) = explode(' ',trim($item->point));
echo $item_title;
echo "<br>";
echo $lat;
echo "<br>";
echo $lng;
echo "<br>";
echo $item->description;
echo "<br>";
echo $item->pubDate;
echo "<br>";
}
答案 0 :(得分:1)
在这样的情况下,不要仅仅echo
预期的价值,并在空的时候放弃并且哭到SO(只是开玩笑的部分)。
使用PHP的var_dump
或print_r
来查看您真正得到的内容。它是NULL吗?它是空字符串吗?是否需要进入其他一些SimpleXMLElement对象?
这不仅会使您的问题更具信息性并且可能得到解答,而且您可能最终会自己解决问题(然后在此处为其他偶然发现错误的人发布答案)。
答案 1 :(得分:0)
重写我的解决方案实际上是正确的:
$feed_url = "http://www.ndbc.noaa.gov/rss/ndbc_obs_search.php?lat=39.5&lon=-122.1&radius=400";
$xmlString = file_get_contents($feed_url);
$xmlString = str_replace('georss:point','point',$xmlString);
$xml = new SimpleXMLElement($xmlString);
$items = $xml->xpath('channel/item');
foreach($items as $item) {
$item_title = mb_convert_case($item->title, MB_CASE_UPPER, "UTF-8");
$description = mb_convert_case(str_replace(' ', '', trim(html_entity_decode(strip_tags($item->description)))), MB_CASE_UPPER, "UTF-8");
list($lat, $lng) = explode(' ',trim($item->point));
echo $item_title . PHP_EOL . $lat . ' x ' . $lng . PHP_EOL . 'published: ' . $item->pubDate . PHP_EOL . 'Description: ' . PHP_EOL . $description . PHP_EOL . PHP_EOL;
}
我把CDATA删除了标签,解码了html实体,并删除了讨厌的空白区域。正则表达式在删除空格方面可能更好。