2014-09-27 3 views
0

Я пытаюсь получить значения из CDATA, которые находятся внутри <b></b>. с simpleXML, но до сих пор без каких-либо хороших результатов. Вот какая-то часть моего файла XML -simpleXML получить значение от CDATA

<item> 
<title> 
<![CDATA[ 
Bez starpniekiem tiek izīrēts pilnībā mēbelēts 1-istabu dzīvoklis 5. stāvā uz ilgu laiku. Dzīvoklis mēbelēts, ar iebūvētu vir ... 
]]> 
</title> 
<link> 
http://www.ss.lv/msg/lv/real-estate/flats/riga/centre/abhkp.html 
</link> 
<pubDate>Thu, 25 Sep 2014 02:59:55 +0300</pubDate> 
<description> 
<![CDATA[ 
<a href="http://www.ss.lv/msg/lv/real-estate/flats/riga/centre/abhkp.html"><img align=right border=0 src="http://i.ss.lv/images/2014-09-24/348773/VHkBG09gR1s=/1.t.jpg" width="160" height="120" alt=""></a> 
District: <b><b>centrs</b></b><br/>Street: <b><b>Klijānu 2</b></b><br/>Rooms: <b><b>1</b></b><br/>m2: <b><b>35.00</b></b><br/>Type: <b><b>Renov.</b></b><br/>: <b><b>8.57</b> €</b><br/>Price: <b><b>300</b> €/mēn.</b><br/><br/><b><a href="http://www.ss.lv/msg/lv/real-estate/flats/riga/centre/abhkp.html">Apskatīt sludinājumu</a></b><br/><br/> 
]]> 
</description> 
</item> 

Я знаю, как получить значения из этого XML-файл, как название, pudDate, ссылка, но я не знаю, как я могу получить значения из описания тега, так что я могу добавьте их в базу данных, отсортированную по цене, району, типу, изображению.

До сих пор я старался сохранить описание тега в строку, а после этого с помощью explode() вырезать части с информацией, в которой я нуждаюсь, у меня есть правильные значения, но у них есть теги. Некоторые с тегами.

Это то, что я пытался -

$url = "http://www.ss.lv/lv/real-estate/flats/riga/hand_over/rss/"; 

$result = simplexml_load_file($url); 

foreach ($result->channel->item as $item) { 
    $title =(string)$item->title; 
    description = (string)$item->description; 
    $link = $item->link; 
    $pubDate = $item->pubDate; 

// Cut out from description price 
    $parts = explode("Price: ", $description); 
    $pri= ""; 
    for ($i = 1; $i < 2; $i++) { 
     $pri= $parts[$i]; 
    } 
    $parts2 = explode("</b>", $pri); 
    for ($i = 1; $i < 2; $i++) { 
     $price= $parts2[0]; 
    } 

, но я думаю, что мое решение absoloutly неправильно, и результат черенка - <b><b>300 or <b>650

поэтому мой вопрос: как я могу получить чистые значения из моего CDATA, используя что-то похожее на

$pubDate = $item->pubDate 

используя что-то подобное?

$description = (string)$item->description->b[0] - для получения правильных значений от CDATA.

ответ

1

В вашем simplexml_load_file(), вам нужно добавить параметр LIBXML_NOCDATA флаг:

$url = "http://www.ss.lv/lv/real-estate/flats/riga/hand_over/rss/"; 
$result = simplexml_load_file($url, 'SimpleXMLElement', LIBXML_NOCDATA); 
                 // ^^ here 
foreach($result->channel->item as $item) { 
    $title = (string) $item->title; 
    $desc = (string) $item->description; 
    $dom = new DOMDocument($desc); 
    $dom->loadHTML($desc); 
    $bold_tags = $dom->getElementsByTagName('b'); 
    foreach($bold_tags as $b) { 
     echo $b->nodeValue . '<br/>'; 
    } 
} 
+0

Спасибо. Он работает, но после первого цикла я получил каждое следующее значение x2. Но если я сохраняю значения в базе данных, я могу просто запустить проверку базы данных, если данные уже существуют, а затем, если они существуют, не записывайте их, правильно? – Santar

+0

@Santar да, конечно, вы могли бы это сделать, если бы были некоторые дубликаты, но я думаю, что слишком много накладных расходов, вы также можете поместить их в массив, а затем в конце внутреннего цикла после этого используйте 'array_unique() ', так что вам не нужно проверять каждый раз в БД, это было бы намного предпочтительнее – Ghost

+0

Могу я задать вам последний вопрос? Как я могу получить только цены от $ b? Я краснею все, чтобы Stackoverflow использовал 'item (x)', bur, когда я пишу echo '$ b-> nodeValue-> item (2)' или '$ b-> item (2) -> nodeValue', он не работает – Santar

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