SimpleXML用PHP选择属性?

时间:2016-01-28 14:46:20

标签: php xml attributes simplexml

好的,我之前从未使用过SimpleXML,而且我遇到了一些问题

这是我的PHP:

map.api.php

$location = $_SESSION['location'];
$address = $location; // Business Location
$prepAddr = str_replace(' ','+',$address);
$feedUrl="http://nominatim.openstreetmap.org/search?q=". $prepAddr ."&format=xml&addressdetails=1&polygon=1";

$sxml = simplexml_load_file($feedUrl);

foreach($sxml->attributes() as $type){
  $lat = $type->place['lat'];
  $long = $type->place['lon'];
}

这是我正在使用的XML表的一个例子。

<searchresults timestamp="Thu, 28 Jan 16 14:16:34 +0000" attribution="Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright" querystring="M27 6bu, 149 Station road, Swinton, Manchester" polygon="true" exclude_place_ids="65827001" more_url="http://nominatim.openstreetmap.org/search.php?format=xml&exclude_place_ids=65827001&accept-language=en-US,en;q=0.8&polygon=1&addressdetails=1&q=M27+6bu%2C+149+Station+road%2C+Swinton%2C+Manchester">
  <place place_id="65827001" osm_type="way" osm_id="32861649" place_rank="26" boundingbox="53.5122168,53.5190893,-2.3402445,-2.3331231" lat="53.5156919" lon="-2.3368185" display_name="Station Road, Newtown, Salford, Greater Manchester, North West England, England, M27 4AE, United Kingdom" class="highway" type="secondary" importance="0.5">
    <road>Station Road</road>
    <suburb>Newtown</suburb>
    <town>Salford</town>
    <county>Greater Manchester</county>
    <state_district>North West England</state_district>
    <state>England</state>
    <postcode>M27 4AE</postcode>
    <country>United Kingdom</country>
    <country_code>gb</country_code>
  </place>
</searchresults>

我想从&lt; 地方&gt;中选择“ lat ”和“ lon ”属性,但是当我回显{{ 1}}和$lat它们都是空的,为什么?

2 个答案:

答案 0 :(得分:1)

当你像上面那样调用属性时,它只会对第一个元素起作用,在你的情况下是第一个元素。您需要在您想要属性的元素上调用属性。最简单的方法是

$sxml->place[0]->attributes()

这有意义吗?基本上你告诉SimpleXML寻找你想要分析的元素,然后返回一个表示该元素属性的新SimpleXML对象。查看文档help

你有另一个选择是使用xpath返回所有的place元素,然后在你有多个地方的情况下迭代这些元素并在每个元素上调用attributes()。

答案 1 :(得分:1)

好的,我自己解决了这个问题。

而不是通过foreach循环运行所有内容(如下所示):

foreach($sxml->attributes() as $type){
 $lat = $type->place['lat'];
 $long = $type->place['lon'];
}

我只是直接获取属性值并将它们存储在变量中:

$lat = $sxml->place->attributes()->lat;
$long = $sxml->place->attributes()->lon;

然后返回错误/警告:Warning: main() [function.main]: Node no longer exists

通过使用isset并检查该值是否存在,您可以解决此问题。

if (isset($sxml->place))
{
 $lat = $sxml->place->attributes()->lat;
 $long = $sxml->place->attributes()->lon;
}