2013-06-05 58 views
0

我解析以下RSS提要(相關部分所示)使用PHP和SimpleXML進行RSS解析:如何輸入名稱空間項目?

<item> 
    <title>xxx</title> 
    <link>xxx</link> 
    <guid>xxx</guid> 
    <description>xxx</description> 
    <prx:proxy> 
     <prx:ip>101.226.74.168</prx:ip> 
     <prx:port>8080</prx:port> 
     <prx:type>Anonymous</prx:type> 
     <prx:ssl>false</prx:ssl> 
     <prx:check_timestamp>1369199066</prx:check_timestamp> 
     <prx:country_code>CN</prx:country_code> 
     <prx:latency>20585</prx:latency> 
     <prx:reliability>9593</prx:reliability> 
    </prx:proxy> 
    <prx:proxy>...</prx:proxy> 
    <prx:proxy>...</prx:proxy> 
    <pubDate>xxx</pubDate> 
</item> 
<item>...</item> 
<item>...</item> 
<item>...</item> 

使用PHP代碼

$proxylist_rss = file_get_contents('http://www.xxx.com/xxx.xml'); 
$proxylist_xml = new SimpleXmlElement($proxylist_rss); 

foreach($proxylist_xml->channel->item as $item) { 

    var_dump($item); // Ok, Everything marked with xxx 
    var_dump($item->title); // Ok, title 

    foreach($item->proxy() as $entry) { 
     var_dump($entry); //empty 

    } 

} 

雖然我可以訪問所有標有XXX,我無法裏面PRX訪問任何內容:代理 - 主要是因爲:不能出現在有效的php varnames中。

問題是如何到達prx:ip,例如

謝謝!

回答

2

看看SimpleXMLElement::children,你可以訪問該命名空間的元素。

例如: -

<?php 
$xml = '<xml xmlns:prx="http://example.org/"> 
<item> 
    <title>xxx</title> 
    <link>xxx</link> 
    <guid>xxx</guid> 
    <description>xxx</description> 
    <prx:proxy> 
     <prx:ip>101.226.74.168</prx:ip> 
     <prx:port>8080</prx:port> 
     <prx:type>Anonymous</prx:type> 
     <prx:ssl>false</prx:ssl> 
     <prx:check_timestamp>1369199066</prx:check_timestamp> 
     <prx:country_code>CN</prx:country_code> 
     <prx:latency>20585</prx:latency> 
     <prx:reliability>9593</prx:reliability> 
    </prx:proxy> 
</item> 
</xml>'; 

$sxe = new SimpleXMLElement($xml); 
foreach($sxe->item as $item) 
{ 
    $proxy = $item->children('prx', true)->proxy; 
    echo $proxy->ip; //101.226.74.169 
} 

安東尼。

+0

大。我沒有意識到你可以在children()中指定命名空間。謝謝。 –

2

我只是去掉了 「PRX:」 ......

$proxylist_rss = file_get_contents('http://www.xxx.com/xxx.xml'); 
$proxylist_rss = str_replace('prx:', '', $proxylist_rss); 

$proxylist_xml = new SimpleXmlElement($proxylist_rss); 

foreach($proxylist_xml->channel->item as $item) { 
    foreach($item->proxy as $entry) { 
     var_dump($entry); 
    } 
} 

http://phpfiddle.org/main/code/jsz-vga

1

試試這樣說:

$proxylist_rss = file_get_contents('http://www.xxx.com/xxx.xml'); 
$feed = simplexml_load_string($proxylist_rss); 
$ns=$feed->getNameSpaces(true); 
foreach ($feed->channel->item as $item){ 
    var_dump($item); 
    var_dump($item->title); 
    $proxy = $item->children($ns["prx"]); 
    $proxy = $proxy->proxy; 
    foreach ($proxy as $key => $value){ 
     var_dump($value); 
    } 
} 
+0

謝謝你的輸入。動態獲取名稱空間將是一個好幫手。 +1 –

相關問題