我正在加载一个XML文件,如下所示:
$places=simplexml_load_file("http://www.43places.com/service/search_places?api_key=1234&q=america");
$allPlaces=$places->xpath('//place');
foreach($allPlaces as $title)
{
echo "a";
}
只是为了测试它,文件正在正确加载,您可以在此处看到XML文件。
知道为什么它没有循环吗?
我不确定为什么 XPath 不起作用,但是,根据我在那里看到的 XML 结构,你真的不需要 XPath。 SimpleXMLElements可能有点看跌,但使用这种替代循环结构将非常容易:
foreach( $places->place as $place )
{
echo "a";
}
而且你根本不需要xpath查询的开销;你想要的结构已经在那里了。
它不是循环的,因为它不返回任何节点。这是为什么呢?
从技术上讲,<place>
元素位于它自己的命名空间中:http://www.43places.com/xml/2005/rc#
,因此place
只是元素的所谓本地名称,而不是它的全名。Xpath 不接受全名,但您可以使用您选择的名称(前缀)为 xpath 操作注册命名空间,然后在 xpath 查询中使用它:
$places->registerXPathNamespace("a", "http://www.43places.com/xml/2005/rc#");
$allPlaces = $places->xpath('//a:place');
此查询现在选择您要查找的 20 个左右place
元素。
另请参阅:SimpleXML:使用包含命名空间的 XML。