2014-09-30 94 views
0

我如何才能從我的xml cdata標籤中獲得選定的值?foreach xml節點返回所選元素

到目前爲止,在計算器的幫助,我可以得到所有的<b>標籤字符串

$result = simplexml_load_file($url, 'SimpleXMLElement', LIBXML_NOCDATA); 

    foreach ($result->channel->item as $item) { 
     $desc = $item->description; 
     $dom = new DOMDocument($desc); 
     $dom->loadHTML($desc); 
     $bold_tags = $dom->getElementsByTagName('b'); 
     foreach($bold_tags as $b) { 
      echo $b->nodeValue . "<br>"; 
     } 

,但它會響應哪些是內部<b>所有的數據,但我想只讓我們說價格。 我紅色在計算器使用->item(x)來獲得該值,但沒有任何工作。如果我把它這樣echo $b->nodeValue->item(2) . "<br>";echo $b->item(2)->nodeValue . "<br>";。那麼我應該在哪裏放置它,或者我應該用什麼來獲得價格只有<b>元素。價格將永遠在同一個地方。

這裏是進我的CDATA:

<a href="//www.ss.lv/msg/lv/real-estate/flats/riga/purvciems/deblb.html"> 
    <img align="right" border="0" src="//i.ss.lv/images/2014-10-01/349288/VHkAHkBlRlo=/1.t.jpg" width="160" height="120" alt=""> 
</a> District: <b><b>Purvciems</b></b><br /> 
Street: <b><b>Dudajeva g. 12</b></b><br /> 
Rooms: <b><b>2</b></b><br /> 
m2: <b><b>50</b></b><br /> 
Type: <b><b>LT proj.</b></b><br /> 
: <b><b>3</b> €</b><br /> 
Price: <b><b>150</b> €/mēn.</b><br /> 
<br /> 
<b><a href="//www.ss.lv/msg/lv/real-estate/flats/riga/purvciems/deblb.html">Apskatīt sludinājumu</a></b><br /> 
<br /> 
]]> 
+0

這將是非常困難的解析,因爲它是如此混亂。 [API](https://www.ss.lv/lv/api/)是否提供了更好的數據獲取選項? – 2014-09-30 22:29:59

+0

@ialarmedalien他們所有的API給我的是一些JavaScript代碼,將他們的網站窗口添加到我的網站,或者我可以使用這個網站的RSS提要,在這個CDATA需要的所有信息 – Santar 2014-09-30 23:04:37

+0

@Santar hello santar查看我的答案 – Ghost 2014-10-01 01:24:15

回答

1

你可以試試這個方法來解析這些價格:

$url = "http://www.ss.lv/lv/real-estate/flats/riga/hand_over/rss/"; 
$result = simplexml_load_file($url, 'SimpleXMLElement', LIBXML_NOCDATA); 

$data = array(); 
foreach($result->channel->item as $item) { 
    $temp = array(); 

    $title = (string) trim($item->title); 
    $desc = $item->description; 

    $temp['title'] = $title; 

    $dom = new DOMDocument('1.0', 'utf-8'); 
    $desc = mb_convert_encoding($desc, 'HTML-ENTITIES', "UTF-8"); 
    $dom->loadHTML($desc); 
    $xpath = new DOMXpath($dom); 
    $price_tag = $xpath->query('//text()[contains(., "Cena")]'); // target Cena, 
    // i didn't know this was PRICE in translation haha 
    $price = $price_tag->item(0)->nextSibling->nodeValue; 
    $temp['price'] = $price; 
    $data[] = $temp ; 
} 

echo '<pre>'; 
print_r($data); 

好了,爲的解釋:

所以我們的目標是獲得這些價格存在於CDATA中的<description>標籤中。

所以每個<item>節點包含它們看起來像這樣:

<a href="//www.ss.lv/msg/lv/real-estate/flats/riga/centre/colfo.html"> 
    <img align=right border=0 src="//i.ss.lv/images/2014-08-25/346391/VHkPH0FiQVo=/1.t.jpg" width="160" height="120" alt=""> 
</a> 
Rajons: <b>centrs</b> 
<br/>Iela: <b>Rūpniecības 7</b><br/>Ist.: <b>4</b> 
<br/>m2: <b>145</b><br/>Sērija: <b>Renov.</b><br/>: <b>10.34 €</b> 
<br/>Cena: <b>1,500 €/mēn.</b><br/> 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // this one 
<br/><b><a href="//www.ss.lv/msg/lv/real-estate/flats/riga/centre/colfo.html">Apskatīt sludinājumu</a></b><br/><br/> 

所以我們的目標是,通過使用XPath,搜索價格指數(以上的價格)。所以根據標記這個正常的文本節點(不是一個元素或不是一個標籤)。

所以我們的目標包含「以上的價格」的文本元素:

//text()[contains(., "Cena")] 

所以每個以上的價格/價格它有一個兄弟包含特定值<b>標籤,所以我們的目標每個以上的價格/價格和點下一個兄弟是<b>標籤

item(0)->nextSibling->nodeValue 
Cena/Price -> nextSibling (which is b tag) -> its value 
+0

謝謝。使用您的解決方案,我可以獲得所需的所有值, 但是您能否稍微解釋一下您的代碼,因此我知道它不會簡單地複製粘貼它。就像我們爲什麼使用xpath,但在前面的問題DOM解析? – Santar 2014-10-01 16:20:38

+0

hello @Santar我已經添加了解釋 – Ghost 2014-10-02 00:18:46