2013-08-07 2 views
2

Я знаю, что версии этого вопроса заданы раньше, но у меня есть определенная проблема в этой версии.Разбор RSS-кода CDATA вне тегов с PHP

Я пытаюсь вытащить некоторый текст из RSS-канала, который встроен в CDATA, но вне XML-тегов. Вот RSS файл:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="/rss/ndbcrss.xsl"?> 
<rss version="2.0" xmlns:georss="http://www.georss.org/georss" xmlns:dc="http://purl.org/dc/elements/1.1/"> 
    <channel> 
    <title>NDBC - Station 46042 - MONTEREY - 27NM WNW of Monterey, CA Observations</title> 
    <description><![CDATA[This feed shows recent marine weather observations from Station 46042.]]></description> 
    <link>http://www.ndbc.noaa.gov/</link> 
    <pubDate>Wed, 07 Aug 2013 21:06:45 UT</pubDate> 
    <lastBuildDate>Wed, 07 Aug 2013 21:06:45 UT</lastBuildDate> 
    <ttl>30</ttl> 
    <language>en-us</language> 
    <managingEditor>[email protected]</managingEditor> 
    <webMaster>[email protected]</webMaster> 
    <image> 
     <url>http://weather.gov/images/xml_logo.gif</url> 
     <title>NOAA - National Weather Service</title> 
     <link>http://www.ndbc.noaa.gov/</link> 
    </image> 
    <item> 
     <pubDate>Wed, 07 Aug 2013 21:06:45 UT</pubDate> 
     <title>Station 46042 - MONTEREY - 27NM WNW of Monterey, CA</title> 
     <description><![CDATA[ 
     <strong>August 7, 2013 1:50 pm PDT</strong><br /> 
     <strong>Location:</strong> 36.785N 122.469W<br /> 
     <strong>Wind Direction:</strong> SW (220&#176;)<br /> 
     <strong>Wind Speed:</strong> 1.9 knots<br /> 
     <strong>Wind Gust:</strong> 1.9 knots<br /> 
     <strong>Significant Wave Height:</strong> 2.3 ft<br /> 
     <strong>Dominant Wave Period:</strong> 14 sec<br /> 
     <strong>Average Period:</strong> 6.9 sec<br /> 
     <strong>Mean Wave Direction:</strong> SSE (160&#176;) <br /> 
     <strong>Atmospheric Pressure:</strong> 30.11 in (1019.5 mb)<br /> 
     <strong>Pressure Tendency:</strong> -0.01 in (-0.3 mb)<br /> 
     <strong>Air Temperature:</strong> 60.8&#176;F (16.0&#176;C)<br /> 
     <strong>Water Temperature:</strong> 59.9&#176;F (15.5&#176;C)<br /> 
     ]]></description> 
     <link>http://www.ndbc.noaa.gov/station_page.php?station=46042</link> 
     <guid>http://www.ndbc.noaa.gov/station_page.php?station=46042&amp;ts=1375908600</guid> 
     <georss:point>36.785 -122.469</georss:point> 
    </item> 
    </channel> 
</rss> 

Я пытаюсь получить '2.3 фт', '14 сек»и 'SSE (160 °)' из приведенных ниже строк:

<strong>Significant Wave Height:</strong> 2.3 ft<br /> 
<strong>Dominant Wave Period:</strong> 14 sec<br /> 
<strong>Mean Wave Direction:</strong> SSE (160&#176;) <br /> 

я могу отделите CDATA от него, а затем получите доступ к сильным элементам [x], но я не могу понять, как получить вышеприведенный текст, который находится за пределами тегов.

EDIT

Thank you Carl! использование explode/regex отлично работало. Еще один инструмент, добавленный к моей маленькой (но растущей) сумке.

Вот рабочий код, который я использовал для хранения трех элементов:

<?php 
$url = "http://www.ndbc.noaa.gov/data/latest_obs/46042.rss";  
$xml = simplexml_load_file($url); 

$data = $xml->channel->item->description; 


foreach (explode("\n", $data) as $key=>$line) { 
    preg_match('/(\<strong>.+?\<\/strong>)(.*)?<br/', $line, $matches); 
    if (! empty($matches)) { 
     $dataDescr[$key] = $matches[1]; 
     $dataVal[$key] = $matches[2]; 
    } 
} 
$sigWavHt = $dataVal[5]; 
$domWavPer = $dataVal[6]; 
$meanWavDir = $dataVal[8]; 

echo "$sigWavHt, $domWavPer, $meanWavDir"; //to test results 
?> 

ответ

1

Если вы уверены, что данные согласуются с вашим примером вы могли бы использовать регулярное выражение для извлечения данных.

Например:

$data = "<strong>Significant Wave Height:</strong> 2.3 ft<br /> 
<strong>Dominant Wave Period:</strong> 14 sec<br /> 
<strong>Mean Wave Direction:</strong> SSE (160&#176;) <br />"; 

foreach (explode("\n", $data) as $line) { 
    preg_match('/(\<strong>.+?\<\/strong>)(.*)?<br/', $line, $matches); 
    if (! empty($matches)) { 
     // The part with the <strong> tags is now in $matches[1], and 
     // the part after is in $matches[2] 
     echo "Key: {$matches[1]}\tValue: {$matches[2]}\n"; 
    } 
} 

Глядя на комбикорма вы публикуемую выше, вы будете хотеть иметь в виду, что первая дата строка не имеет «данных» часть после <strong> содержания. ..

Смежные вопросы