Eu tenho algo parecido com isto:
$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
);
É suposto baixar XML de geonames. Se print_r($xml)
eu receber:
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
)
Eu faço como você pode ver $xml->code[0]->lat
e ele retorna um objeto. Como posso obter o valor?
Respostas:
Você deve converter o objeto simpleXML em uma sequência.
fonte
Você também pode usar o método mágico __toString ()
fonte
sprintf
com o%s
formato. Ouecho
e buffer de saída, ou ou ou ou ...Se você souber que o valor do elemento XML é um número flutuante (latitude, longitude, distância), poderá usar
(float)
Além disso,
(int)
para número inteiro:fonte
se você não souber o valor do elemento XML, poderá usar
Funciona quando você precisa determinar se o valor é um número, porque
(string)
sempre retornará string eis_int($value)
retornafalse
fonte
Para mim, é mais fácil usar matrizes do que objetos,
Então, eu converto um objeto Xml,
fonte
$xml['foo'][0]['bar'][0]['@attributes']['baz']
vez de$xml->foo->bar['baz']
.Esta é a função que sempre me ajudou a converter os valores relacionados a xml em array
fonte
experimentar
current($xml->code[0]->lat)
retorna elemento sob o ponteiro atual da matriz, que é 0, para que você obtenha valor
fonte
você pode usar o '{}' para acessar sua propriedade e, em seguida, pode fazer o que quiser. Salve ou exiba o conteúdo.
Do seu exemplo, ela é o código
fonte
{}
menos que haja caracteres especiais como hífens.$xml->{'key'}
é apenas uma maneira mais feia de escrever$xml->key
.fonte
echo
forças$v
se tornam uma corda e não um objeto, exatamente como(string)$v
faria.você pode converter array com esta função
fonte
<0>
não é uma tag XML válida, portanto isso nunca aconteceria. Alguns nomes XML válidos não são nomes PHP válidos, como<foo-bar>
, mas podem ser tratados com->{'foo-bar'}
sintaxe. Ou você quer apenas acessar o0
elemento th em uma lista de elementos nomeados semelhantes? Isso é só$parent->childName[0]
.fonte
$codeZero = $xml->code[0]
e$lat = $xml->code[0]->lat
foreach ( $xml->code as $code ) { $lat = (string)$code->lat; echo $lat; }
Mas o que você está repetindo aqui é "todos os filhos do primeiro<code>
elemento"; o que não faz muito sentido para mim. Para esclarecer,$xml->code->children()
é uma abreviação de$xml->code[0]->children()
, não "crianças chamadascode
".fonte