douzhi9939 2014-09-30 22:23
浏览 29
已采纳

foreach xml节点返回所选元素

How can I get only selected value from my xml cdata tag?

So far with help in stackoverflow I can get all the <b> tags in a string

$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>";
        }

but it will echo out all data which are inside <b>, but I want to get only let's say price. I red in stackoverflow to use ->item(x) to get that value, but nothing is working.If I put it like this echo $b->nodeValue->item(2) . "<br>"; or echo $b->item(2)->nodeValue . "<br>";. So where should I put it or what should I use to get only <b> element with price. The price will always be in the same place.

Here is my CDATA from feed:

<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 />
]]>
  • 写回答

1条回答 默认 最新

  • duannei0044 2014-10-01 01:19
    关注

    You can try this method to parse those prices:

    $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);
    

    Okay, for the explanation:

    So the goal is getting those prices which resides in the <description> tag inside the CDATA.

    So each <item> node contains them which looks like this:

    <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/>
    

    So the goal is, by using xpath, search for the Prices (Cena). So according to markup this a normal text node (Not an element or is not a tag).

    So we target that text element which contains "Cena":

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

    So each Cena/Price it has the next sibling <b> tags which contain that particular value, so we target each Cena/Price and point the next sibling which is <b> tag

    item(0)->nextSibling->nodeValue
    Cena/Price -> nextSibling (which is b tag) -> its value
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥18 模拟电路问题解答有偿
  • ¥15 Matlab在app上输入带有矩阵形式的初始条件发生错误
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题