删除 xml 中的属性

remove attribute in xml

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

<?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="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        <title>xxxx.fr</title>
        <link>http://www.xxxx.fr</link>
        <description>
            XXXXX
        </description>
        <language>fr-fr</language>
        <item>
            <guid isPermalink="false">1947196298709465</guid>
            <title>
                <![CDATA[ Cette artiste utilise la gélatine comme support pour créer des œuvres en 3 dimensions ]]>
            </title>
            <media:title xmlns:media="media" type="plain">
                <![CDATA[ Cette artiste utilise la gélatine comme support pour créer des œuvres en 3 dimensions ]]>
            </media:title>
            <pubDate>2018-12-10 19:30:01</pubDate>
            <media:content xmlns:media="media" duration="216.723" url="https://scontent.xx.fbcdn.net/v/t66.18014-6/10000000_2xxxxx_861713768647979845_n.mp4?_nc_cat=100&efg=eyJ2ZW5jb2RlX3RhZyI6Im9lcF9oZCJ9&_nc_ht=scontent.xx&oh=9cfb72ebc8fc2bdfd8ae7816899b29e2&oe=5CAC9FBC">
                <media:thumbnail height="1080" width="1080" url="https://scontent.xx.fbcdn.net/v/t15.5256-10/47695217_1947199588709136_5040968xxxxx1952_n.jpg?_nc_cat=1&_nc_ht=scontent.xx&oh=ea3af9f82426e5a3f9ca1a3e907b09ca&oe=5CAE1DBB"/>
                <media:category scheme="https://support.aerserv.com/hc/en-us/articles/207148516-List-of-IAB-Categories">IAB8</media:category>
            </media:content>
        </item>
    </channel>
</rss>

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

中添加 xmlns:media="media"

SimpleXML 在命名空间方面不太擅长生成干净的 XML,尽管您添加的元素稍微不正确...

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

第三个参数需要是 URI 而不是前缀...

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

第二部分(虽然需要先完成)是如何添加命名空间。一旦在 XML 层次结构中定义了命名空间 'properly',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'));