PHP XML无法解析CDATA

时间:2011-09-08 18:23:34

标签: php xml

我正在从国家数据浮标中心解析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&#176;)<br />
    <strong>Wind Speed:</strong> 11 knots<br />
    <strong>Atmospheric Pressure:</strong> 30.03 in (1017.0 mb)<br />
    <strong>Air Temperature:</strong> 62&#176;F (16.9&#176;C)<br />
    <strong>Dew Point:</strong> 50&#176;F (10.2&#176;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&amp;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>";
} 

2 个答案:

答案 0 :(得分:1)

在这样的情况下,不要仅仅echo预期的价值,并在空的时候放弃并且哭到SO(只是开玩笑的部分)。

使用PHP的var_dumpprint_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实体,并删除了讨厌的空白区域。正则表达式在删除空格方面可能更好。