Взять все ссылки из XML-карты сайта и поместить их в массив?
У меня есть карта сайта со многими URL-адресами. Что-то вроде:
<url>
<loc>
http://site.com/
</loc>
<priority>
0.50
</priority>
<changefreq>
daily
</changefreq>
<lastmod>
2011-07-27T06:58:53+00:00
</lastmod>
</url>
<url>
<loc>
http://site.com/link
И т.д. и т.д.....
Мне нужно получить все ссылки в карте сайта, больше ничего.
Я пробовал:
$links = file('sitemap.xml', FILE_IGNORE_NEW_LINES);
foreach($links as $link) {
echo $link;
}
Теперь, когда повторяются все ссылки и оставляются все <loc>, <priority>
и т. Д. и т. Д., Но это все еще включает изменение frequency, lastmod
и т. Д. и т. Д.....
Таким образом, вывод выглядит следующим образом:
http://site.com/ 11 0.50 12 daily 13 2011-07-27T06:58:53+00:00 14 15 16 http://site.com/page.html 17 0.40 18 daily 19 2011-07-
И так далее....
Мне нужно просто получить ссылки и поместить их в массив. Есть какие-нибудь идеи?
Спасибо ты.
ИЗМЕНИТЬ:
Вот код, который я использую:
$urls = array();
$xml='sitemap.xml';
$DomDocument = new DOMDocument();
$DomDocument->preserveWhiteSpace = false;
$DomDocument->loadXML("$xml"); // $DOMDocument->load('filename.xml');
$DomNodeList = $DomDocument->getElementsByTagName('from');
foreach($DomNodeList as $url) {
$urls[] = $url->nodeValue;
}
//display it
echo "<pre>";
print_r($urls);
echo "</pre>";
, который возвращает ошибку: Warning: DOMDocument::loadXML() [domdocument.loadxml]: Start tag expected, '<' not found in Entity, line: 1
Поэтому я попытался проверить, может ли он даже загружать xml: я изменил имя xml-файла на недопустимое ($xml='sit___emap.xml';
)
Я должен был получить сообщение об ошибке, в котором говорилось, что он не может открыть файл, но вместо этого он выдал ту же ошибку, что и раньше, с правильным набором имени файла. Так что я не думаю, что это карта сайта.
6 answers
Я не смог заставить пример @Andreyknupp работать. Вот что работает для меня:
$urls = array();
$DomDocument = new DOMDocument();
$DomDocument->preserveWhiteSpace = false;
$DomDocument->load('filename.xml');
$DomNodeList = $DomDocument->getElementsByTagName('loc');
foreach($DomNodeList as $url) {
$urls[] = $url->nodeValue;
}
//display it
echo "<pre>";
print_r($urls);
echo "</pre>";
Вы можете сделать это..
<?php
$urls = array();
$DOMDocument = new DOMDocument();
$DOMDocument->preserveWhiteSpace = false;
$DOMDocument->loadXML($xml); // $DOMDocument->load('filename.xml');
$XPath = new DOMXPath($DOMDocument); // you can use getElementsByTagName
foreach($XPath->query('//url/loc') as $url) {
// $urls[$url->nodeName] = $url->nodeValue;
$urls[] = $url->nodeValue;
}
print_r($urls);
Вывод такой:
Array
(
[0] => http://site.com/
)
Использовать любой синтаксический анализатор XML? DOMDocument
, SimpleXML
, xml_parse
Также можно использовать simplexml
$xml=simplexml_load_file($file);
$links=$xml->xpath('//url/loc');
print_r($links);
Редактировать: возможно, потребуется использовать strval
при использовании этих элементов массива, поскольку он все еще считается объектом SimpleXML.
Самый простой способ - это
$strXml = @file_get_contents($url);
if (false == $strXml)
die('Could not open url. Check your spelling and try again');
$txt ="";
// So simple using SimpleXml
$sitemap = @new SimpleXmlElement($strXml);
foreach($sitemap->url as $url) {
$txt .= $url->loc . "\n";
}
Я проверил скорость выполнения с помощью метода Леви Моррисона (DOMDocument) и метода тауфикайтали (SimpleXML). Результаты настолько поразительны, что я должен поделиться этим с вами. Мой sitemap.xml в нем было 11140 ссылок (карта сайта моей веб-галереи).
Метод 1 - Документ DOMDocument
$start = microtime(true); // define a variable for checking execution time
$urls = array();
$DomDocument = new DOMDocument();
$DomDocument->preserveWhiteSpace = false;
$DomDocument->load('sitemap.xml');
$DomNodeList = $DomDocument->getElementsByTagName('loc');
foreach($DomNodeList as $url) {
$urls[] = $url->nodeValue;
}
echo "<pre>";
print_r($urls);
echo "</pre>";
$time_elapsed_secs = microtime(true) - $start;
echo $time_elapsed_secs . " seconds of execution time"; // show the execution time in seconds
Показал время выполнения 50,7 секунды
Метод 2 - SimpleXML
$start = microtime(true); // define a variable for checking execution time
$urls = array();
$strXml = @file_get_contents('sitemap.xml');
$sitemap = @new SimpleXmlElement($strXml);
foreach($sitemap->url as $url) {
$urls[] = strval($url->loc);
}
echo "<pre>";
print_r($urls);
echo "</pre>";
$time_elapsed_secs = microtime(true) - $start;
echo $time_elapsed_secs . " seconds of execution time"; // show the execution time in seconds
Показал время выполнения 0,129 секунды
Это ОГРОМНАЯ разница. Метод SimpleXML почти в 400 раз быстрее.