Warning: array_merge(): Argument #2 is not an array in /hsphere/local/home/magistr/codeismy.name/wp-content/plugins/wp-pagenavi/scb/Options.php on line 46

CMS своими руками. Работа с XML — RSS. Часть 2

Дата: Май 14, 2009

(0) комментариев

Продолжаем серию статей про работу с базами XML. Сегодня я покажу, как организовать сервис RSS на своём сайте. И сначала как всегда немного теории
RSS — семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Информация из различных источников, представленная в формате RSS, может быть собрана, обработана и представлена пользователю в удобном для него виде специальными программами-агрегаторами.
В разных версиях аббревиатура RSS имела разные расшифровки:
* Rich Site Summary (RSS 0.9x) — обогащённая сводка сайта;
* RDF Site Summary (RSS 0.9 и 1.0) — сводка сайта с применением инфраструктуры описания ресурсов;
* Really Simple Syndication (RSS 2.x) — очень простое приобретение информации.

Вот пример исходного кода RSS канала:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:yandex="http://news.yandex.ru" xmlns="http://example.com/envelope">
  <channel>
    <title>codeismy.name</title>
    <link>http://codeismy.name</link>
    <description>Яндекс news</description>
    <lastBuildDate>hu, 14 May 2009 10:09:17 +0300</lastBuildDate>

    <ttl>60</ttl>
    <image>
      <title>TotoSoft</title>
      <url>http://codeismy.name</url>
      <link>Яндекс news</link>
    </image>
  </chan

Именно генерацию такого кода из исходного массива я и собираюсь показать.
На входе у нас есть массив который мы каким либо образом получили ранее

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$xmlData = array(
    'rss' => array(
        '~attr' => array(
                        'version' => '2.0',
            'xmlns:yandex' => 'http://news.yandex.ru',
            'xmlns' => 'http://example.com/envelope'
        ),
        'channel' => array(
            'title' => 'codeismy.name',
            'link' => 'http://codeismy.name',
            'description' => 'Яндекс news',
            'lastBuildDate' => 'hu, 14 May 2009 10:09:17 +0300',
            'ttl' => '60',
            'image' => array(
                'title' => 'TotoSoft',
                'url' => 'http://codeismy.name',
                'link' => 'Яндекс news'
                                )
                     

Теперь напишем несколько функций по склеиванию и обработке данного массива.
Для начала работы нам необходимо создать объект XML

1
2
$xml = new DOMDocument("1.0", "UTF-8");
$xml->formatOutput = true;

Далее напишем следующие функции:
Создание атрибутов для элементов, под атрибутами здесь понимается например xmlns параметр

1
2
3
4
5
6
7
function XMLCreateAttributes($xmlDoc, $xmlElement, $attributes)
{
    foreach($attributes as $attrName => $attrValue)
    {
        $xsi = $xmlDoc->createAttribute($attrName); //создаём атрибут
        $xmlElement->appendChild($xsi);
        $xsi->appendChild($xmlDoc->CreateTextNode($attrValue)); //добавляем

Создаём элементы XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function XMLCreateElement($xmlDoc, $xmlParent, $elemName, $elemText = false,
    $attributes = array())
{
    // Создаём элемент
    $elem = $xmlDoc->createElement($elemName);
    $xmlParent->appendChild($elem);
   
    // Вставляем контент
    if ($elemText !== false)
        $elem->appendChild($xmlDoc->createTextNode($elemText));
   
    // Устанавливаем атрибуты
    if (count($attributes) > 0)
        XMLCreateAttrib

И теперь собираем всё до кучи

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function XMLAddElementsFromArr($xmlDoc, $xmlParent, $elems)
{
    foreach($elems as $name => $value)
        if($value == '~ignore')
            continue;
   
        elseif ($name == '~attr' && is_array($value))
            XMLCreateAttributes($xmlDoc, $xmlParent, $value);
           
        elseif(strpos($name, '~array:') !== false && is_array($value))
        {
            $elName = str_replace('~array:', '', $name);
            foreach($value as $val)
                XMLAddElementsFromArr($xmlDoc, $xmlParent, array($elName => $val));
        }
           
        elseif (is_string($value) || is_numeric($value))
            XMLCreateElement($xmlDoc, $xmlParent, $name, $value);
       
        elseif($value === false)
            XMLCreateElement($xmlDoc, $xmlParent, $name);
           
        elseif(is_array($value))
        {
            $elem = XMLCreateElement($xmlDoc, $xmlParent, $name);
            XMLAddElementsFromArr($xmlDoc, $elem, $value);
        }
}

Когда все функции готовы запускаем главную функцию создания RSS
Выглядеть всё это будет так:

1
2
3
4
5
$xml = new DOMDocument("1.0", "UTF-8");
$xml->formatOutput = true;
XMLAddElementsFromArr($xml, $xml, $xmlData);
$xmlStr = $xml->saveXML();
echo $xmlStr;
a

    Автор: Sergey

    , ,




    Нет комментариев на "CMS своими руками. Работа с XML — RSS. Часть 2"

    Нет комментариев.


    Вы можете продолжить обсуждение этой статьи на форуме


    Имя : 
    Почта : 
    Сайт : 
    Комментарий : 

    Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

    Создание сайта - Echo-group Раскрутка сайтов