2017-09-19 27 views
0

我似乎無法找到一種方法,從以下XML提要正確得到一些值:獲得從XML提要某些值與節點名稱中冒號

<?xml version="1.0" encoding="UTF-8"?> 
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:newznab="http://www.newznab.com/DTD/2010/feeds/attributes/" encoding="utf-8"> 
<channel> 
    <atom:link href="https://REMOVED.com/api" rel="self" type="application/rss+xml"/> 
    <title>REMOVED</title> 
    <description>API Details</description> 
    <link>https://REMOVED.com/</link> 
    <language>en-gb</language> 
    <webMaster>[email protected]</webMaster> 
    <category>Stuff</category> 
    <generator>Me</generator> 
    <ttl>10</ttl> 
    <docs>https://removed.com/apihelp/</docs> 
    <image url="https://removed.com/themes/shared/img/logo.png" title="REMOVED" link="https://removed.com/" description="Visit REMOVED"/> 
    <newznab:response offset="0" total="125000"/> 
    <item> 
    <title>Fair.Go.2017.09.18.HDTV.x264-FiHTV </title> 
    <guid isPermaLink="true">https://REMOVED.com/details/427d2b6c5fb3a0f73bd43be4bb8cff955700fd4d</guid> 
    <link>https://REMOVED.com/getnzb/427d2b6c5fb3a0f73bd43be4bb8cff955700fd4d.nzb&amp;i=1&amp;r=3bc4e94ef14337e4e2b490a3897c48f6</link> 
    <comments>https://REMOVED.com/details/427d2b6c5fb3a0f73bd43be4bb8cff955700fd4d#comments</comments> 
    <pubDate>Tue, 19 Sep 2017 10:18:21 +0200</pubDate> 
    <category>TV &gt; SD</category> 
    <description>Fair.Go.2017.09.18.HDTV.x264-FiHTV </description> 
    <enclosure url="https://REMOVED.com/getnzb/427d2b6c5fb3a0f73bd43be4bb8cff955700fd4d.nzb&amp;i=1&amp;r=3bc4e94ef14337e4e2b490a3897c48f6" length="168013625" type="application/x-nzb"/> 
    <newznab:attr name="category" value="5030"/> 
    <newznab:attr name="size" value="168013625"/> 
    <newznab:attr name="files" value="17"/> 
    <newznab:attr name="poster" value="[email protected] (yeahsure)"/> 
    <newznab:attr name="prematch" value="1"/> 
    <newznab:attr name="info" value="https://REMOVED.com/api?t=info&amp;id=427d2b6c5fb3a0f73bd43be4bb8cff955700fd4d&amp;r=3bc4e94ef14337e4e2b490a3897c48f6"/> 
    <newznab:attr name="grabs" value="0"/> 
    <newznab:attr name="comments" value="0"/> 
    <newznab:attr name="password" value="0"/> 
    <newznab:attr name="usenetdate" value="Tue, 19 Sep 2017 10:07:47 +0200"/> 
    <newznab:attr name="group" value="alt.binaries.teevee"/> 
    </item> 
</channel> 
</rss> 

我需要的價值和從這些節點獲取大小和usenetdate的值,並將它們放入數組中。這裏只有1個,但在真正的飼料中有數百個。

在PHP中不能很難嗎?然而XMLWriter,DOM和SimpleXML都讓我失望。或者我失敗了。

任何指針?

+0

請分享您嘗試過的代碼以及您的預期輸出。 –

+0

元素名稱的格式爲「prefix:localname」,其中前綴(例如'newznab')表示XML名稱空間(這裏是http:// www.newznab.com/DTD/2010/ feeds/attributes /)。爲了處理這個XML,你需要了解你選擇的處理庫如何處理XML命名空間。通常你會想使用(名字空間,本地名稱)對來定位元素。 –

回答

1

問題出現在使用名稱空間時,在任何XML系統中處理它們都很簡單,在這裏我使用了SimpleXML。我也假設它是重複的頻道。

要使用命名空間,您需要將它們註冊到XML系統,以便它知道如何將它們與搜索關聯起來,所以在這裏我使用newznab作爲attr的前綴。但這是您在XML文檔中看到的內容,因此它更易於閱讀。 XPath使用[@name='size']使其找到具有此屬性/值組合的attr的實例,然後返回value屬性。

$xml = simplexml_load_file('NewFile.xml'); 
$xml->registerXPathNamespace("atom", "http://www.w3.org/2005/Atom"); 
$xml->registerXPathNamespace("newznab", "http://www.newznab.com/DTD/2010/feeds/attributes/"); 

foreach($xml->channel as $channel){ 
    echo "Channel title=".(string)$channel->title.PHP_EOL; 
    echo "size=".(string)$channel->xpath("descendant::newznab:attr[@name='size']/@value")[0].PHP_EOL; 
    echo "usenetdate=".(string)$channel->xpath("descendant::newznab:attr[@name='usenetdate']/@value")[0].PHP_EOL; 
}