我有一家公司托管的图片网站。他们为我的网站生成(并向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";
我不知道这对输入是否有任何影响。
答案 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选择上一个节点。