SimpleXML 使用 PHP 选择属性?
SimpleXML selecting attributes with PHP?
好的,我以前从未使用过 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 table 的示例。
<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>
我想 select <place 的“lat”和“lon”属性>,但是当我回显 $lat
和 $long
时它们是空的,为什么?
当您像上面那样调用属性时,它只会作用于第一个元素,在您的例子中是根。您需要在您想要属性的元素上调用属性。最简单的方法是
$sxml->place[0]->attributes()
这有意义吗?基本上,您是在告诉 SimpleXML 寻找您要分析的元素,然后 returning 一个表示该元素属性的新 SimpleXML 对象。查看文档 help
您的另一个选择是使用 xpath return 所有放置元素,然后遍历这些元素并在每个元素上调用 attributes(),以防您有多个位置。
好的,所以我自己解决了这个问题。
而不是 运行 一切都通过 foreach
循环(如下所示):
foreach($sxml->attributes() as $type){
$lat = $type->place['lat'];
$long = $type->place['lon'];
}
我只是直接获取了属性值并将它们存储在一个变量中:
$lat = $sxml->place->attributes()->lat;
$long = $sxml->place->attributes()->lon;
然后返回一个 error/warning:Warning: main() [function.main]: Node no longer exists
通过使用 isset
并首先检查该值是否存在,您可以解决这个问题。
if (isset($sxml->place))
{
$lat = $sxml->place->attributes()->lat;
$long = $sxml->place->attributes()->lon;
}
好的,我以前从未使用过 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 table 的示例。
<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>
我想 select <place 的“lat”和“lon”属性>,但是当我回显 $lat
和 $long
时它们是空的,为什么?
当您像上面那样调用属性时,它只会作用于第一个元素,在您的例子中是根。您需要在您想要属性的元素上调用属性。最简单的方法是
$sxml->place[0]->attributes()
这有意义吗?基本上,您是在告诉 SimpleXML 寻找您要分析的元素,然后 returning 一个表示该元素属性的新 SimpleXML 对象。查看文档 help
您的另一个选择是使用 xpath return 所有放置元素,然后遍历这些元素并在每个元素上调用 attributes(),以防您有多个位置。
好的,所以我自己解决了这个问题。
而不是 运行 一切都通过 foreach
循环(如下所示):
foreach($sxml->attributes() as $type){
$lat = $type->place['lat'];
$long = $type->place['lon'];
}
我只是直接获取了属性值并将它们存储在一个变量中:
$lat = $sxml->place->attributes()->lat;
$long = $sxml->place->attributes()->lon;
然后返回一个 error/warning:Warning: main() [function.main]: Node no longer exists
通过使用 isset
并首先检查该值是否存在,您可以解决这个问题。
if (isset($sxml->place))
{
$lat = $sxml->place->attributes()->lat;
$long = $sxml->place->attributes()->lon;
}