Доброго вечера, господа!
Встала тут передо мной задачка. Достаточно тривиальная, как я понимаю. Сгенерить Sitemap.xml. Куча всякого по этому поводу написано, но готового решения, такого как нужно мне я так и не нашел, в результате чего решил писать сам. С использованием расширения DOM. На это меня натолкнула статейка вот эта: http://makecode[dot]ru/2010/08/gener[dot][dot][dot]-sitemap-on-php/ Но имеющееся решение меня не устроило по двум параметрам: во-первых, там каждый раз генерится новый сайтмэп, а во-вторых у них он получается весь одной длииииной строкой, а хотелось бы, чтобы был со всякими отсупами и переносами строк (ну, или у меня, по крайней мере чего-то не так с formatOutput).
И тут я столкнулся с тем, что документация по DOM, в том числе и на php.su.. ну, мягко говоря, оставляет желать лучшего. Провтыкав в нее цельный день, я-таки написал код, который дописывает новый блок урлов к сайтмапу. Но по-моему, он очень индусский получился.
Дык вот, вопрос - как он должен выглядеть по-идее? Особенно меня напрягает использование 4-х разных nodes содержащих перенос каретки и табуляцию
Исходный сайтмап:
CODE ( htmlphp):
скопировать код в буфер обмена
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://example.com/</loc> <lastmod>22-01-2011</lastmod> <changefreq>weekly</changefreq> <priority>0.6</priority> </url> </urlset>
Код пхп:
PHP:
скопировать код в буфер обмена
<? //загружаем файл с существующим sitemap $doc = DOMDocument::load('http://localhost/sitemap.xml'); //выбираем элементы 'urlset' - на самом деле, он там один $urlSet = $doc->getElementsByTagName('urlset'); //создаем элементы DOM $url = $doc->createElement("url"); $loc = $doc->createElement('loc', 'http://example.com/foo/bar/'); $lastmod = $doc->createElement('lastmod', '22-01-2011'); $changefreq = $doc->createElement('changefreq', 'weekly'); $priority = $doc->createElement('priority', '0.6'); //те самые индусские элементы... $n = $doc->createTextNode("\n"); $n2 = $doc->createTextNode("\n\t"); $t = $doc->createTextNode("\t"); $nt = $doc->createTextNode("\n\t\t"); $nt2 = $nt->cloneNode(); $nt3 = $nt->cloneNode(); $nt4 = $nt->cloneNode(); //вставляем эелементы в DOM $urlSet->item(0)->appendChild($t); $urlNode = $urlSet->item(0)->appendChild($url); $urlSet->item(0)->appendChild($n); $urlNode->appendChild($nt); $urlNode->appendChild($loc); $urlNode->appendChild($nt2); $urlNode->appendChild($lastmod); $urlNode->appendChild($nt3); $urlNode->appendChild($changefreq); $urlNode->appendChild($nt4); $urlNode->appendChild($priority); $urlNode->appendChild($n2); //записываем DOM обратнов XML echo $doc->saveXML(); ?>
Итоговый sitemap.xml:
CODE ( htmlphp):
скопировать код в буфер обмена
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://example.com/</loc> <lastmod>22-01-2011</lastmod> <changefreq>weekly</changefreq> <priority>0.6</priority> </url> <url> <loc>http://example.com/foo/bar/</loc> <lastmod>22-01-2011</lastmod> <changefreq>weekly</changefreq> <priority>0.6</priority> </url> </urlset>
Т.е. в итоге получается все ровно так, как и должно быть. Мне не нравится реализация =)(Отредактировано автором: 19 Февраля, 2011 - 22:07:53)
|