删除xml中的属性

时间:2018-12-11 15:45:50

标签: php xml rss simplexml

我正在用PHP构建RSS提要,但对命名空间有些困惑 这是我的代码

t.ts <- ts(data=dtf$energy, start=as.numeric(dtf$time[1]), frequency=1/(60*60*3))

plot(t.ts, xaxt="n")
time <- as.POSIXct(c(time(t.ts)), origin="1970-01-01")
time <- time[seq_along(time) %% 4 == 1] #select every fourth. less crowded
axis(1, labels=format(time, format="%b %d - %H:%M"), at=time, cex.axis=0.8)

和输出

<?php

header("Content-Type: application/rss+xml; charset=UTF-8");
$xml = new SimpleXMLElement('<rss></rss>', 0 , false , 'media' , true);
$xml->addAttribute("version", "2.0");
$xml->addAttribute("xmlns:xmlns:media" ,"http://search.yahoo.com/mrss/");

$channel = $xml->addChild("channel");
$channel->addChild("title", "xxxxxx.fr");
$channel->addChild("link", "http://www.xxxxxx.fr");
$channel->addChild("description", "XXXXXXX");
$channel->addChild("language", "fr-fr");

foreach($data as $key => $entry){

    $item = $channel->addChild("item");
    $guid = $item->addChild("guid", $entry['video_id']);
    $guid->addAttribute('isPermalink' , 'false');
    $item->addChild("title", "<![CDATA[ " .htmlspecialchars($entry['title']). " ]]>");

    $title = $item->addChild('media:title', "<![CDATA[ " .htmlspecialchars($entry['title']). " ]]>" , 'media');
    $title->addAttribute('type' ,'plain');

    $pubdate = $item->addChild("pubDate" , $entry['created_time']->format('Y-m-d H:i:s'));

    $media = $item->addChild('media:content', null , 'media');
    $media->addAttribute('duration', $entry['duration']);
    $media->addAttribute('url', $entry['source_video']);

    $thumbnail = $media->addChild('media:thumbnail' , null , 'media');
    $thumbnail->addAttribute('height' , '1080');
    $thumbnail->addAttribute('width' , '1080');
    $thumbnail->addAttribute('url', $entry['picture_path']);

    $category = $media->addChild('media:category', $iab , 'media');
    $category->addAttribute('scheme' , 'https://support.aerserv.com/hc/en-us/articles/207148516-List-of-IAB-Categories');

}

echo preg_replace('/xmlns:xmlns="media"\s?/', '', $xml->asXML($page_name.'-2.xml'));

?>

我想要的是删除rss节点中预期的所有xmlns:media =“ media” 也许我在命名空间上做错了什么,我不知道为什么在media:title或media:content中添加xmlns:media =“ media”

1 个答案:

答案 0 :(得分:1)

当涉及到名称空间时,SimpleXML并不擅长生成干净的XML,尽管您添加的元素略有错误...

$media = $item->addChild('media:content', null , 'media');

第三个参数必须是URI,而不是前缀...

$media = $item->addChild('media:content', null , "http://search.yahoo.com/mrss/");

第二部分(尽管需要首先完成)是如何添加名称空间。一旦在XML层次结构中“正确”定义了名称空间,SimpleXML就可以不重新声明它,但是现在使用addAttribute()添加它的方式实际上并没有声明它,而是添加了一个属性设置...

$xml->addAttribute("xmlns:xmlns:media" ,"http://search.yahoo.com/mrss/");

伪造此方法的一种方法是使用所需的新名称空间将属性添加到根元素,然后将其删除。幸运的是,SimpleXML不会清除声明,现在已为整个文档设置了该声明。

$xml->addAttribute("media:a", "temp", "http://search.yahoo.com/mrss/");
unset($xml->attributes("media", true)["a"]);

您还可以删除最后一个替换项...

echo $xml->asXML($page_name.'-2.xml'));