Tengo algo como esto:
$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
);
Se supone que descarga XML de geonames. Si lo hago print_r($xml)
, obtengo:
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
)
Hago lo que puedes ver $xml->code[0]->lat
y devuelve un objeto. ¿Como puedo obtener el valor?
Respuestas:
Tienes que lanzar un objeto simpleXML a una cadena.
fuente
También puedes usar el método mágico __toString ()
fuente
sprintf
con el%s
formato. Oecho
y búfer de salida, o o o o ...Si sabe que el valor del elemento XML es un número flotante (latitud, longitud, distancia), puede usar
(float)
Además,
(int)
para el número entero:fuente
Si no conoce el valor del elemento XML, puede usar
Funciona cuando necesita determinar si el valor es un número, porque
(string)
siempre devolverá una cadena yis_int($value)
devolveráfalse
fuente
Para mí es más fácil usar matrices que objetos,
Entonces, convierto un Xml-Object,
fuente
$xml['foo'][0]['bar'][0]['@attributes']['baz']
lugar de hacerlo$xml->foo->bar['baz']
.Esta es la función que siempre me ha ayudado a convertir los valores relacionados con xml en matriz
fuente
tratar
current($xml->code[0]->lat)
devuelve el elemento debajo del puntero actual de la matriz, que es 0, por lo que obtendrá valor
fuente
puede usar el '{}' para acceder a su propiedad, y luego puede hacer lo que desee. Guárdelo o muestre el contenido.
De tu ejemplo, ella es el código
fuente
{}
menos que haya caracteres especiales como guiones allí.$xml->{'key'}
es solo una forma más fea de escribir$xml->key
.fuente
echo
obliga$v
a convertirse en una cadena en lugar de un objeto, tal como lo(string)$v
haría.puedes convertir una matriz con esta función
fuente
<0>
no es una etiqueta XML válida, por lo que eso nunca sucedería. Algunos nombres XML válidos no son nombres PHP válidos, como<foo-bar>
, pero eso se puede manejar con->{'foo-bar'}
sintaxis. ¿O simplemente te refieres a acceder al0
elemento th en una lista de elementos con nombre similares? Eso es justo$parent->childName[0]
.fuente
$codeZero = $xml->code[0]
y$lat = $xml->code[0]->lat
foreach ( $xml->code as $code ) { $lat = (string)$code->lat; echo $lat; }
Pero lo que estás haciendo aquí es "todos los hijos del primer<code>
elemento"; lo cual no tiene mucho sentido para mí. Para aclarar,$xml->code->children()
es la abreviatura de$xml->code[0]->children()
, no "niños llamadoscode
".fuente