Получить значение из объекта SimpleXMLElement

У меня есть что-то вроде этого:

$url = "http://ws.geonames.org/findNearbyPostalCodes?country=pl&placename="; $url .= rawurlencode($city[$i]); $xml = simplexml_load_file($url); echo $url."\n"; $cityCode[] = array( 'city' => $city[$i], 'lat' => $xml->code[0]->lat, 'lng' => $xml->code[0]->lng ); 

Предполагается загрузить XML из geonames. Если я делаю print_r($xml) я получаю:

 SimpleXMLElement Object ( [code] => Array ( [0] => SimpleXMLElement Object ( [postalcode] => 01-935 [name] => Warszawa [countryCode] => PL [lat] => 52.25 [lng] => 21.0 [adminCode1] => SimpleXMLElement Object ( ) [adminName1] => Mazowieckie [adminCode2] => SimpleXMLElement Object ( ) [adminName2] => Warszawa [adminCode3] => SimpleXMLElement Object ( ) [adminName3] => SimpleXMLElement Object ( ) [distance] => 0.0 ) 

Я делаю так, как вы можете видеть $xml->code[0]->lat и он возвращает объект. Как я могу получить стоимость?

Вы должны наложить объект simpleXML на строку.

 $value = (string) $xml->code[0]->lat; 

Вы также можете использовать магический метод __toString ()

 $xml->code[0]->lat->__toString() 

Если вы знаете, что значение элемента XML является числом с плавающей точкой (широта, долгота, расстояние), вы можете использовать (float)

 $value = (float) $xml->code[0]->lat; 

Кроме того, (int) для целочисленного числа:

 $value = (int) $xml->code[0]->distance; 

если вы не знаете значение XML-элемента, вы можете использовать

 $value = (string) $xml->code[0]->lat; if (ctype_digit($value)) { // the value is probably an integer because consists only of digits } 

Он работает, когда вам нужно определить, является ли значение числом, потому что (string) всегда возвращает строку, а is_int($value) возвращает false

Для меня проще использовать массивы, чем объекты,

Итак, я конвертирую Xml-Object,

 $xml = simplexml_load_file('xml_file.xml'); $json_string = json_encode($xml); $result_array = json_decode($json_string, TRUE); 

Это функция, которая всегда помогла мне преобразовать значения, связанные с xml, в массив

 function _xml2array ( $xmlObject, $out = array () ){ foreach ( (array) $xmlObject as $index => $node ) $out[$index] = ( is_object ( $node ) ) ? _xml2array ( $node ) : $node; return $out; } 

try current($xml->code[0]->lat)

он возвращает элемент под текущим указателем массива, который равен 0, поэтому вы получите значение

 header("Content-Type: text/html; charset=utf8"); $url = simplexml_load_file("http://URI.com"); foreach ($url->PRODUCT as $product) { foreach($urun->attributes() as $k => $v) { echo $k." : ".$v.' <br />'; } echo '<hr/>'; } 

вы можете преобразовать массив с помощью этой функции

 function xml2array($xml){ $arr = array(); foreach ($xml->children() as $r) { $t = array(); if(count($r->children()) == 0) { $arr[$r->getName()] = strval($r); } else { $arr[$r->getName()][] = xml2array($r); } } return $arr; } 
 $codeZero = null; foreach ($xml->code->children() as $child) { $codeZero = $child; } $lat = null; foreach ($codeZero->children() as $child) { if (isset($child->lat)) { $lat = $child->lat; } } 

вы можете использовать '{}' для доступа к вашему имуществу, а затем можете делать все, что пожелаете. Сохраните его или покажите содержимое.

  $varName = $xml->{'key'}; 

Из вашего примера – код

  $filePath = __DIR__ . 'Your path '; $fileName = 'YourFilename.xml'; if (file_exists($filePath . $fileName)) { $xml = simplexml_load_file($filePath . $fileName); $mainNode = $xml->{'code'}; $cityArray = array(); foreach ($mainNode as $key => $data) { $cityArray[..] = $mainNode[$key]['cityCode']; .... } } 
 foreach($xml->code as $vals ) { unset($geonames); $vals=(array)$vals; foreach($vals as $key => $value) { $value=(array)$value; $geonames[$key]=$value[0]; } } print_r($geonames); этот foreach($xml->code as $vals ) { unset($geonames); $vals=(array)$vals; foreach($vals as $key => $value) { $value=(array)$value; $geonames[$key]=$value[0]; } } print_r($geonames); не foreach($xml->code as $vals ) { unset($geonames); $vals=(array)$vals; foreach($vals as $key => $value) { $value=(array)$value; $geonames[$key]=$value[0]; } } print_r($geonames);