Взять все ссылки из XML sitemap и поместить их в массив? - PullRequest
2 голосов
/ 02 декабря 2011

У меня есть карта сайта со многими 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-

и так далее ...

Мне нужно просто получить ссылки и поместить их в массив. Есть идеи?

Спасибо.

EDIT:

Вот код, который я использую:

<code>$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 "
";

Что возвращает ошибку: Warning: DOMDocument::loadXML() [domdocument.loadxml]: Start tag expected, '<' not found in Entity, line: 1

Итак, я попытался проверить, может ли он даже загрузить xml: я изменил имя файла xml на недопустимое ($xml='sit___emap.xml';)

Я должен был получить сообщение о том, что он не может открыть файл, но вместо этого он обнаружил ту же ошибку, что и раньше, с правильным именем файла. Так что я не думаю, что это карта сайта.

Ответы [ 6 ]

8 голосов
/ 02 декабря 2011

Мне не удалось заставить @ пример AndreyKnupp работать.Вот что у меня работает:

<code>$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 "
";
1 голос
/ 02 декабря 2011

Вы можете сделать это ..

<?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/
)
0 голосов
/ 10 июля 2015

Я проверил время выполнения скорости, используя метод Леви Моррисона (DOMDocument) и метод тауфигаитали (SimpleXML).Результаты настолько удивительны, что я должен поделиться этим с вами.В моем sitemap.xml было 11140 ссылок (карта сайта моей веб-галереи).

Метод 1 - DOMDocument

<code>$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 "
"; $ time_elapsed_secs = microtime (true) - $ start; echo $ time_elapsed_secs.«время выполнения секунд»; // показать время выполнения в секундах

Показано время выполнения 50,7 секунд

Метод 2 - SimpleXML

<code>$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 "
";$ time_elapsed_secs = microtime (true) - $ start;echo $ time_elapsed_secs.«секунды выполнения»;// показать время выполнения в секундах

Показано время выполнения 0,129 секунды

Это ОГРОМНАЯ разница.Метод SimpleXML работает почти в 400 раз.

0 голосов
/ 30 июня 2015

самый простой способ это

$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";
}
0 голосов
/ 02 декабря 2011

Можно также использовать simplexml

$xml=simplexml_load_file($file);
$links=$xml->xpath('//url/loc');
print_r($links);

Редактировать: может потребоваться использовать strval при использовании этих элементов массива, поскольку он все еще считается объектом SimpleXML.

0 голосов
/ 02 декабря 2011

Использовать любой XML-парсер? DOMDocument, SimpleXML, xml_parse

...