2

在过去的几个小时里,我一直在努力从 xml 文件中获取 CDATA,即使我尝试了此处此处此处显示的不同方法。

我的困境与通过 xenForo 的 RSS 提要检索线程数据有关。这是我试图检索的 RSS 数据的示例,除了检索<content:encoded>.

示例文件:

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>News &amp; Announcements</title>
    <description>All of our important news and announcements will be here.</description>
    <pubDate>Fri, 26 Jun 2015 14:54:20 +0000</pubDate>
    <lastBuildDate>Fri, 26 Jun 2015 14:54:20 +0000</lastBuildDate>
    <generator>********* ****</generator>
    <link>https://***.****.****/forum/news/</link>
    <atom:link rel="self" type="application/rss+xml" href="https://***.****.****/forum/news/index.rss"/>
    <item>
      <title>Site under development.</title>
      <pubDate>Thu, 25 Jun 2015 05:49:43 +0000</pubDate>
      <link>https://***.****.****/threads/site-under-development.3/</link>
      <guid>https://***.****.****/threads/site-under-development.3/</guid>
      <author>invalid@example.com (*****)</author>
      <dc:creator>ShortCut Central</dc:creator>
      <content:encoded><![CDATA[Content to retrieve. <br /> Some more content a part of the same section]]></content:encoded>
    </item>
  </channel>
</rss>

我当前的代码看起来像

<?php
class SCC_Main_miscFuncs {
    public static function printMostRecentPost() {
        // Re-enable the below once we're ready to release
        //$rssUrl = func_get_arg(1);
        $rssUrl = 'https://www.shortcutcentral.org/indev.rss';
        $xml = simplexml_load_string(self::returnContents($rssUrl));
        $rawData = self::returnContents($rssUrl); // Properly contains the CDATA
        echo '<pre>';
        //echo (string) $xml->channel->item->encoded;
        //echo (string) $xml->channel->item->content;
        //var_dump($xml);
        echo '</pre>';
        //echo (string) $xml->channel->item;
        //echo $array[@attributes]['item']['link'];
        //echo $xml->message;
    }

    public static function returnContents($url){
        $curl_handle=curl_init();
        curl_setopt($curl_handle, CURLOPT_URL,$url);
        curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
        curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl_handle, CURLOPT_USERAGENT, 'ShortCut Central');
        $query = curl_exec($curl_handle);
        curl_close($curl_handle);
        return $query;
    }
} 

除了未解析的 $rawData 之外,似乎没有显示上述 CDATA。我觉得这可能是因为我没有正确调用它(对 XML 和命名空间和命名空间前缀来说是全新的),但它没有通过 var_dump 显示给我......地狱。我看到了一些关于使用 XML 子项的早期帖子,但我并不完全理解这个概念,这就是为什么如果我的解决方案需要 XML 子项,我们将不胜感激。

谢谢!

还可能值得一提的是,我的 php 代码以它的方式组织(类和公共、静态函数),因此我可以将它用作 xenForo 的附加组件。

4

1 回答 1

1

您是正确的,在 SimpleXML 中返回命名空间节点的一种方法是使用SimpleXMLElement::children(),但您必须将命名空间作为其第一个参数传递。您可以传递完整的命名空间字符串"http://purl.org/rss/1.0/modules/content/",但传递它的前缀更容易"content",然后提供TRUE作为第二个参数来通知children()您传递的是前缀而不是完整的字符串。

$xml所以在你的对象上使用一个表达式,比如:

echo (string)$xml->channel->item->children('content', TRUE)->encoded;
// Prints:
// Content to retrieve. <br /> Some more content a part of the same section

使用在代码上下文中最有意义的任何方法来检索循环中的所有相关节点。

从命名空间节点检索属性并没有太大的不同。<atom:link href>例如:

echo (string)$xml->channel->children('atom', true)->link->attributes()['href'];
// Prints
// https://***.****.****/forum/news/index.rss
于 2015-06-27T16:31:41.450 回答