simpleXML 从 CDATA 获取值 [重复]

Posted

技术标签:

【中文标题】simpleXML 从 CDATA 获取值 [重复]【英文标题】:simpleXML get value from CDATA [duplicate] 【发布时间】:2014-11-22 02:02:14 【问题描述】:

我正在尝试从 <b></b> 中的 CDATA 获取值。用simpleXML,但到目前为止还没有任何好的结果。这是我的 xml 文件的一部分 -

<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"   ></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];
    

但我认为我的解决方案是绝对错误的,切割的结果是 - &lt;b&gt;&lt;b&gt;300 or &lt;b&gt;650

所以我的问题是:如何使用类似于

的方法从 CDATA 中获取干净的值
$pubDate = $item->pubDate

使用类似的东西?

$description = (string)$item-&gt;description-&gt;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/>';
    

【讨论】:

谢谢。它有效,但在第一次循环之后,我得到了每个下一个值 x2。但是如果我将值保存到数据库中,我可以简单地运行数据库检查数据是否已经存在,然后如果它们存在则不要写入它们,对吗? @Santar 是的,当然你可以这样做,如果有一些重复,但我认为开销太大,你也可以将它们放在一个数组中,然后放在内部的末尾之后循环使用array_unique(),这样您就不需要每次都在数据库中检查,这会更可取 我能问你最后一个问题吗?我怎样才能只从 $b 获得价格?我把所有的 *** 都弄红了使用item(x),但是当我写 echo $b-&gt;nodeValue-&gt;item(2)$b-&gt;item(2)-&gt;nodeValue 时它不起作用 @Santar 好的,我会尽快回复您 你好@Santar 你能再为这个问题设置另一个问题吗,我想在一个单独的问题上回答这个问题,这非常棘手

以上是关于simpleXML 从 CDATA 获取值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 使用 simplexml_load_string 解析 XML - 使用 CDATA 获取空值? [复制]

PHP读取XML数据中CDATA内数值

使用 SimpleXML 和 PHP 通过 https 获取 XML 内容的问题 [重复]

我正在尝试获取值或所有 a: 属性 [重复]

使用 simplexml_load_string 获取 xml 属性 [重复]

php函数simplexml_load_string转xml的小坑