2017-09-19 6 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; 
}