从SimpleXMLElement对象获取值

kub*_*bas 189 php simplexml

我有这样的事情:

$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
);
Run Code Online (Sandbox Code Playgroud)

它应该从geonames下载XML.如果我这样做,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
                )
Run Code Online (Sandbox Code Playgroud)

我可以看到$xml->code[0]->lat,它会返回一个对象.我怎样才能获得价值?

Lui*_*tti 413

您必须将simpleXML Object转换为字符串.

$value = (string) $xml->code[0]->lat;
Run Code Online (Sandbox Code Playgroud)

  • 只是注意到如果你对xml对象进行了json_encode然后json_decode它就会得到一个嵌套的stdObject来处理,当你懒惰和使用简单的结构时非常方便:D (8认同)
  • 这个答案仍然在2016年更加严厉! (6认同)
  • 我不敢相信这是如此复杂。他们为什么要创建一个名为“ getName”而不是“ getValue”的类?为什么要打印空字符串而不是将其手动转换为(string),为什么会打印空字符串?为什么?? (3认同)
  • @user151496 从技术上讲,字符串转换不是给你“值”,而是“文本内容”。但是,是的,一个特别命名的方法会更容易被发现。但是,一旦您习惯了这一点,*使用*实际上并没有更难。 (2认同)

sgl*_*ard 87

你也可以使用魔术方法__toString()

$xml->code[0]->lat->__toString()
Run Code Online (Sandbox Code Playgroud)

  • 或``sprintf`与`%s`格式.或者`echo`和输出缓冲,或者或或者...... (5认同)

Cou*_*Web 16

如果您知道XML元素的值是浮点数(纬度,经度,距离),则可以使用 (float)

$value = (float) $xml->code[0]->lat;
Run Code Online (Sandbox Code Playgroud)

另外,(int)对于整数:

$value = (int) $xml->code[0]->distance;
Run Code Online (Sandbox Code Playgroud)


vla*_*ras 13

如果你知道XML Element的值,你可以使用

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

if (ctype_digit($value)) {
    // the value is probably an integer because consists only of digits
}
Run Code Online (Sandbox Code Playgroud)

当你需要确定value是否为数字时,它会起作用,因为它(string)总是会返回字符串并is_int($value)返回false


daz*_*act 12

对我来说,它比对象更容易使用数组,

所以,我转换了一个Xml-Object,

$xml = simplexml_load_file('xml_file.xml');    
$json_string = json_encode($xml);    
$result_array = json_decode($json_string, TRUE);
Run Code Online (Sandbox Code Playgroud)

  • 转换为JSON然后返回相同的上下文是非常低效的,除非你真的很匆忙.使用对象并不难,如果你真的喜欢数组,你应该将对象原生地转换为数组. (3认同)