从节点名称中带有冒号的 XML 提要中获取某些值
Get certain values from XML feed with a colon in the node name
我似乎找不到从以下 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>hello@REMOVED.com</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&i=1&r=3bc4e94ef14337e4e2b490a3897c48f6</link>
<comments>https://REMOVED.com/details/427d2b6c5fb3a0f73bd43be4bb8cff955700fd4d#comments</comments>
<pubDate>Tue, 19 Sep 2017 10:18:21 +0200</pubDate>
<category>TV > SD</category>
<description>Fair.Go.2017.09.18.HDTV.x264-FiHTV </description>
<enclosure url="https://REMOVED.com/getnzb/427d2b6c5fb3a0f73bd43be4bb8cff955700fd4d.nzb&i=1&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="provide@4u.net (yeahsure)"/>
<newznab:attr name="prematch" value="1"/>
<newznab:attr name="info" value="https://REMOVED.com/api?t=info&id=427d2b6c5fb3a0f73bd43be4bb8cff955700fd4d&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 都让我失望了。或者我辜负了他们。
有什么指点吗?
问题是在使用命名空间时出现的,在任何XML系统中处理它们都非常简单,这里我使用了SimpleXML。我还假设它是重复的频道。
要使用命名空间,你需要在XML系统中注册它们,以便它知道如何将它们与搜索相关联,所以这里我使用newznab
作为[=12]的前缀=].但这是您在 XML 文档中看到的内容,因此它更易于阅读。 XPath 使用 [@name='size']
使其找到具有此 attribute/value 组合的 attr
的实例 - 然后它 returns 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;
}
我似乎找不到从以下 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>hello@REMOVED.com</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&i=1&r=3bc4e94ef14337e4e2b490a3897c48f6</link>
<comments>https://REMOVED.com/details/427d2b6c5fb3a0f73bd43be4bb8cff955700fd4d#comments</comments>
<pubDate>Tue, 19 Sep 2017 10:18:21 +0200</pubDate>
<category>TV > SD</category>
<description>Fair.Go.2017.09.18.HDTV.x264-FiHTV </description>
<enclosure url="https://REMOVED.com/getnzb/427d2b6c5fb3a0f73bd43be4bb8cff955700fd4d.nzb&i=1&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="provide@4u.net (yeahsure)"/>
<newznab:attr name="prematch" value="1"/>
<newznab:attr name="info" value="https://REMOVED.com/api?t=info&id=427d2b6c5fb3a0f73bd43be4bb8cff955700fd4d&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 都让我失望了。或者我辜负了他们。
有什么指点吗?
问题是在使用命名空间时出现的,在任何XML系统中处理它们都非常简单,这里我使用了SimpleXML。我还假设它是重复的频道。
要使用命名空间,你需要在XML系统中注册它们,以便它知道如何将它们与搜索相关联,所以这里我使用newznab
作为[=12]的前缀=].但这是您在 XML 文档中看到的内容,因此它更易于阅读。 XPath 使用 [@name='size']
使其找到具有此 attribute/value 组合的 attr
的实例 - 然后它 returns 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;
}