如何对RSS Feed中的项元素进行排序,将其拉入simpleXML

时间:2017-08-28 17:18:27

标签: php sorting simplexml

我正在尝试对RSS Feed的item元素进行排序。我几乎就在那里,只需要将已排序的项目放回到feed的simpleXML中。我使用以下方式阅读了Feed:

$xml = file_get_contents($myUrl);
$data = simplexml_load_string($xml);

为了能够使用usort,我已将项目拉入数组:

$sortable = array();
foreach($data->channel->item as $node) {
    $sortable[] = $node;
}

更多代码进行实际排序,形式为:

function sorttitlelowhigh($a,$b) {
    return strcmp($a->title, $b->title);
};

并致电:

usort($sortable, 'sorttitlelowhigh');

我已使用以下方法从$ data中删除了原始项目:

$elementsToRemove = array();
$i = 0;
foreach($data->channel->item as $item) {
    if ($i >= 0) {
        $elementsToRemove[] = $item;
    }
    $i++;
}
foreach ($elementsToRemove as $item) {
    unset($item[0]);
}

这是我似乎无法做到的最后一步,将已排序的项目恢复为$ data。请注意,Feed的某些元素包含名称空间和CDATA。

我试过了:

foreach($sortable as $item){
    $data->channel->addChild("item", $item);
}

以及许多其他变体。我知道$ item包含我需要的内容,因为它显示为:

$xml2=$item->asXML();
$xml2 = str_replace('&', '&', $xml2);
$xml2 = str_replace('<', '&lt;', $xml2);
echo '<pre>' . $xml2 . '</pre>';

显示其内容。我通过在大括号{}之间加上描述并在这里手工填充输出来缩短事物:

<item>
  <guid isPermaLink="false">https://www.zazzle.com/pink_and_satin_fabric_effect_with_your_initials_compact_mirror-256359221382338484</guid>
  <pubDate>Sat, 24 Jun 2017 18:53:36 GMT</pubDate>
  <title><![CDATA[ {text} ]]></title>
  <link>https://www.zazzle.com/pink_and_satin_fabric_effect_with_your_initials_compact_mirror-256359221382338484</link>
  <author>HightonRidley</author>
  <description><![CDATA[ {text} ]]></description>
  <price>$19.50</price>
  <media:title><![CDATA[ {text} ]]></media:title>
  <media:description><![CDATA[ {text} ]]></media:description>
  <media:price>$19.50</media:price>
  <media:thumbnail url=" {a url} "/>
  <media:content url=" {a url} "/>
  <media:keywords><![CDATA[ {text} ]]></media:keywords>
  <media:rating scheme="urn:mpaa">g</media:rating>
</item>

...但无论我尝试什么,我都无法将这些物品带回$ data。我用的最接近的是空物品:

foreach($sortable as $item){
    $data->channel->addChild("item", $item->asXML());
}

有人能帮助我完成这最后一步吗?

0 个答案:

没有答案