从XML站点地图获取所有链接,并将它们放入数组中?

时间:2011-12-01 21:10:37

标签: php xml sitemap

我有一个包含许多网址的站点地图。类似的东西:

<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 个答案:

答案 0 :(得分:8)

我无法让@AndreyKnupp's example工作。这对我有用:

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

答案 1 :(得分:1)

你可以这样做..

<?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/
)

答案 2 :(得分:0)

使用任何 XML解析器? DOMDocumentSimpleXMLxml_parse

答案 3 :(得分:0)

还可以使用simplexml

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

编辑:当您使用这些数组元素时,可能需要使用strval,因为它仍被视为SimpleXML对象。

答案 4 :(得分:0)

最简单的方法是

&#13;
&#13;
$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";
}
&#13;
&#13;
&#13;

答案 5 :(得分:0)

我使用Levi Morrison(DOMDocument)方法与taoufiqaitali方法(SimpleXML)检查了速度执行时间。结果如此惊人,我必须与你分享。 我的sitemap.xml中有11140个链接(我的webgallery的站点地图)。

方法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倍。