Как добавить контент в существующий файл XML? - PullRequest
0 голосов
/ 25 июля 2010

У меня есть генератор xml, написанный на PHP. образец приведен ниже, но несколько строк только из-за недостатка места.

$output =  '<?xml version="1.0" encoding="UTF-8"?>'."\n";
    $output .= '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">'."\n";
    $output .= '<channel rdf:about="'.$urlfr.'">'."\n";
    $output .= '<title>'.$title.'</title>'."\n";
    $output .= '<link>'.$urlorg.'</link>'."\n";
    $output .= '<description></description>'."\n";
    $output .= '<dc:language>'.$lang.'</dc:language>'."\n";
    $output .= '<dc:rights>'.$copyright.'</dc:rights>'."\n";

это сохраняется в файл с именем content-xml.xml. каждый день у меня есть новый контент, добавляемый в этот файл. я хочу добавить новый контент в существующий XML-файл и показать последний контент сверху

Ответы [ 3 ]

2 голосов
/ 25 июля 2010

Используйте DomDocument, если он вам доступен

    //Create an Instance of DomDocument and load existing XML
        $xmlDoc=new DomDocument();
        $xmlDoc->loadXML($xmlString); 
        $xmlDoc->saveXML();
   //Create an Instance of DomDocument with xml to be appended
         $xmlSnippet=new DomDocument();
         $xmlSnippet->loadXML($xmlSnippet);

   // get node to insertbefore let say item so first item in rss feed
   $item = $xmlSnippet->getElementsByTagName("item")->item(0);
   $item = $xmlDoc->importNode($item, true);
  //append to channel node 

   $item = $xmlDoc->documentGetElementByTagName('channel')->item(0)->appendChild($item)

   save doc 

   $xmlDoc->saveXML();
2 голосов
/ 25 июля 2010

Я почти уверен, что есть библиотеки, облегчающие создание RSS-каналов, но если вы хотите сделать это с правильным расширением XML, вот пример с DOM:

Сначала мы определим пространство имен. Это только для лени.

$namespaces = array(
    'xmlns'            => 'http://purl.org/rss/1.0/',
    'xmlns:rdf'        => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
    'xmlns:slash'      => 'http://purl.org/rss/1.0/modules/slash/',
    'xmlns:taxo'       => 'http://purl.org/rss/1.0/modules/taxonomy/',
    'xmlns:dc'         => 'http://purl.org/dc/elements/1.1/',
    'xmlns:syn'        => 'http://purl.org/rss/1.0/modules/syndication/',
    'xmlns:admin'      => 'http://webns.net/mvcb/',
    'xmlns:feedburner' => 'http://rssnamespace.org/feedburner/ext/1.0'
);

Далее вам нужно создать и настроить новый документ. Мы хотим красиво отформатированный UTF8 XML:

// prepare DOMDocument
$dom = new DOMDocument('1.0', 'utf-8');
$dom->formatOutput = TRUE;
$dom->preserveWhitespace = FALSE;

Далее вам нужно создать корневой элемент и добавить в него все пространства имен. Поскольку у нас есть пространства имен в массиве, мы можем просто перебрать массив и добавить их:

// create root node
$root = $dom->createElement('rdf:RDF');
foreach($namespaces as $ns => $uri) {
    $root->setAttributeNS('http://www.w3.org/2000/xmlns/', $ns, $uri);
}
$dom->appendChild($root);

Остальное - создание и добавление узлов. Это всегда одно и то же. Создайте узел, настройте его, добавьте к родительскому элементу. Код ниже эквивалентен вашим сцепленным строкам:

// create and append Channel
$channel = $dom->createElement('channel');
$channel->setAttribute('rdf:about', 'foo');
$root->appendChild($channel);

// create and append Title and Description
$channel->appendChild($dom->createElement('title', 'Example Feed'));
$channel->appendChild($dom->createElement('description'));

// special chars like & are only automatically encoded when added as DOMText
$link = $dom->createElement('link');
$link->appendChild($dom->createTextNode('http://example.com?foo=1&bar=2'));
$channel->appendChild($link);

// we added namespaces to root, so we can simply add ns'ed elements with
$channel->appendChild($dom->createElement('dc:language', 'en'));
$channel->appendChild($dom->createElement('dc:rights', 'public domain'));

И это все. Теперь для вывода, вы делаете:

// output cleanly formatted XML
echo $dom->saveXML();
2 голосов
/ 25 июля 2010

Данные должны откуда-то приходить, верно? Как насчет автоматизации процесса поиска данных. Получив данные, вы можете легко использовать SimpleXML для добавления дочернего узла в ваш корневой узел. :)

...