<?php require_once 'inc/db.php'; class SimpleXMLExtend extends SimpleXMLElement{ public function addCData($nodename,$cdata_text,$namespace=null){ $node = $this->addChild($nodename,null,$namespace); //Added a nodename to create inside the function $node = dom_import_simplexml($node); $no = $node->ownerDocument; $node->appendChild($no->createCDATASection($cdata_text)); } } $sitemap=new SimpleXMLExtend('<?xml version="1.0" encoding="utf-8"?><urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9"/>'); $news=$db->getAll('SELECT * FROM news WHERE time>? ORDER BY time DESC LIMIT 20',(time()-60*60*24*3)); foreach($news as $new){ $url=$sitemap->addChild('url'); $url->addCData('loc','http://www.elondyn.eu/news/'.$new['id']); $news=$url->addChild('news',null,'news'); foreach($keywords as $i => $keyword){ # wywalenie jednoliterowych słów # wywalenie znaków specjalnych } } ?>
Nakładka addCData dodaje mi <[CDATA[ ]]> - oznaczenie zawartości danego elementu jako tekst, który nie podlega walidacji (znaki &, < i > umieszczone w zawartości bez cdata wywalają błąd).
Nadając hamsko nazwę "news:news":
<?php $news=$url->addChild('news:news'); ?>
nie uzyskuje efektu - element ma nazwę "news". W dokumentacji funkcji AddChild znalazłem parametr odpowiadający za ową przestrzeń nazw, ale ustawiając go na "news":
<?php $news=$url->addChild('news',null,'news'); ?>
otrzymałem taki tag: <news xmlns="news">, a we wzorcu google jest <news:news> no i z tego co czytałem o tych przestrzeniach nazw, tak to właśnie powinno wyglądać. A dzieci elementu "news", którym też nadałem tą przestrzeń nazw, nie zmieniły się.
Następnie w funkcji konstruującej SimpleXMLElement znalazłem atrubuty "ns" i "is_prefix" - pierwszy to przestrzeń nazw, a drugi określa czy podana przestrzeń nazw to prefix (znalezione w komentarzach na php.net, przedostatni). Więc dałem w "ns" - "news" i "is_prefix" na true - że to prefix:
$sitemap=new SimpleXMLExtend('<?xml version="1.0" encoding="utf-8"?><urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9"/>',null,false,'news',true);
ale nadal nic się nie zmieniło ;/
Niby to xmlns:news nadaje już głównemu elementowi podczas tworzenia xmla:
'<?xml version="1.0" encoding="utf-8"?><urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9"/>'
ale widocznie w tym SimpleXMLElement trzeba jakoś inaczej to nadać.
A oto co uzyskuje.
Orientuje się ktoś jak to można uzyskać? :-)