удалить атрибут в xml - PullRequest
       28

удалить атрибут в xml

0 голосов
/ 11 декабря 2018

Я создаю RSS-канал в PHP, но я немного путаюсь с пространством имен. Вот мой код

<?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>

Что мне нужно, это удалить все xmlns: media = "media" ожидается в узле rss Возможно, я что-то не так сделал с пространством имен. Я не знаю, почему он добавляет xmlns: media = "media" в media: title или media: content

1 Ответ

0 голосов
/ 12 декабря 2018

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'));
...