通过PHP阅读Google Sitemap XML

时间:2011-12-09 07:33:10

标签: php xml google-sitemap

我有一家公司托管的图片网站。他们为我的网站生成(并向Google提交)站点地图。我正在尝试阅读XML,以便我可以使用我的站点地图中的数据“执行操作”(即搜索缺少的标题和缺少标题 AND 随机在我的网站中发布其中一个条目作为“图像当天“)。站点地图的格式如下:

 <url>
      <loc>http://www/link</loc> 
     <image:image>
          <image:loc>http://www/img.jpg</image:loc> 
          <image:caption>caption for the image here</image:caption> 
          <image:title>title of image here</image:title> 
      </image:image>
  </url>

我的问题是我一直在努力解析这些数据,使其在PHP中可用。我已经尝试过simplexml_load_file,但这似乎只能捕获&lt; loc&gt;而忽略整个&lt; image:image&gt;。我试过 - &gt; xpath(),但结果相同。如何将其变为可用格式?

脚注:为了访问我的站点地图,xml文件被gzip压缩,所以我使用以下格式来“读取”它:

$url = "compress.zlib://http://www/sitemap/0.xml.gz";

我不知道这对输入是否有任何影响。

4 个答案:

答案 0 :(得分:2)

为了完整起见,我用以下内容替换了print_r():

foreach (simplexml_load_string($xml) as $entry) {
    $loc = $entry->loc;
    $caption = $entry->image->caption;
    $title = $entry->image->title;

    // do stuff here
}

答案 1 :(得分:2)

这应该是检索属于其他命名空间的节点的正确(但不是很漂亮)方式(抱歉我的英语不好)。

让我们采用以下站点地图xml:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
    <url>
        <loc>http://www.example.com/</loc>
        <image:image>
            <image:loc>http://www.example.com/img.jpg</image:loc> 
            <image:caption>image caption</image:caption> 
            <image:title>image title</image:title> 
         </image:image>
    </url>
    <url>
        <loc>http://www.example.com/about.php</loc>
    </url>
</urlset>

您从某个网址加载xml:

$sitemap = simplexml_load_file($sitemap_url);

如果你这样做:

$ns = $sitemap->getNamespaces(true);
print_r($ns);

您将获得以下数组:

Array
(
    [] => http://www.sitemaps.org/schemas/sitemap/0.9
    [image] => http://www.google.com/schemas/sitemap-image/1.1
)

让我们选择第一个url节点(当然你会在你的代码中做一个foreach)

$url = $sitemap->url[0];

要读取'image'节点,必须使用'children'方法,将rigth命名空间作为参数传递,所以:

$child = $url->children($ns['image']);

或甚至丑陋的

$child = $url->children('http://www.google.com/schemas/sitemap-image/1.1');

做一个

print_r($child);

你会得到:

SimpleXMLElement Object
(
    [image] => SimpleXMLElement Object
        (
            [loc] => http://www.example.com/img.jpg
            [caption] => image caption
            [title] => image title
        )

)

所以,您可以使用例如:

$caption = $child->image->caption;

希望这可以提供帮助。本文中的更多信息http://blog.stuartherbert.com/php/2007/01/07/using-simplexml-to-parse-rss-feeds/

答案 2 :(得分:1)

糟糕的解决方案:

$url = "compress.zlib://http://www/sitemap/0.xml.gz";
$xml=file_get_contents($url);

$xml=preg_replace('/image:(.*?)>/i','$1>',$xml);

print_r(simplexml_load_string($x));

答案 3 :(得分:1)

解析为数组!

作为http://www.sitemaps.org/protocol.html XML描述,它是一个具有良好数组表示的简单树。

您可以使用3-line XML reader

$sitemap_array = json_decode(
   json_encode( simplexml_load_string($sitemap_xml) ),
   TRUE
);

所以请使用eg。 foreach($sitemap_array['image:image'] as $r)遍历它(按var_dump($sitemap_array)检查)...另请参阅oop5.iterations

PS:你也可以在simplexml上通过XPath选择上一个节点。