使用SimpleXMLElement检查空虚的奇怪行为

时间:2013-05-31 08:59:00

标签: php simplexml

我使用SimpleXMLElement发现了一个非常奇怪的行为:

    $xmlstr = '<?xml version="1.0" standalone="yes"?>
<movies>
<movie>
    <title></title>
</movie>
</movies>';


$movies = new SimpleXMLElement($xmlstr);

$subelement = $movies->movie->title;

echo "Accesing normal: " . PHP_EOL;
echo var_dump($movies->movie->title) . PHP_EOL;
echo var_dump(empty($movies->movie->title)) . PHP_EOL;

echo "Accesing subelement: " . PHP_EOL;
echo var_dump($subelement) . PHP_EOL;
echo var_dump(empty($subelement)) . PHP_EOL;

当使用主对象访问子元素时,空函数返回true,并且在使用包含子元素的变量访问子元素时返回false。

如果我在变量中传递元素而不是从主元素传递元素时,为什么empty的行为会有所不同?

在这种情况下,也许是空的不是检查空虚的方法,在simpleXMLElement中检查元素是否为空的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

对我来说,它似乎与错误报告中提到的问题相同:https://bugs.php.net/bug.php?id=62717

我知道的唯一解决方案是检查您的标题是否为空字符串,或将变量转换为字符串:

if($subelement == "")

OR

$subelement = (string)$movies->movie->title;

但是如果你在转换成字符串后使用empty()(也许)另一个问题是,如果你的电影标题是例如,那也是如此。 0或其他似乎为空的其他(数字)字符串,请参阅:http://php.net/manual/en/function.empty.php - 返回值

这将按预期工作:

<?php
$xmlstr = '<?xml version="1.0" standalone="yes"?>
<movies>
    <movie>
        <title>asdf</title>
    </movie>
</movies>';


$movies = new SimpleXMLElement($xmlstr);

$subelement = $movies->movie->title;

echo "Accesing normal: " . PHP_EOL;
 var_dump($movies->movie->title) . PHP_EOL;
 var_dump(empty($movies->movie->title)) . PHP_EOL; 
echo"<br><br>";
echo "Accesing subelement: " . PHP_EOL;
 var_dump($subelement) . PHP_EOL;
 var_dump($subelement == "") . PHP_EOL; string

或使用强制转换为字符串:

<?php

$xmlstr = '<?xml version="1.0" standalone="yes"?>
<movies>
    <movie>
        <title>0</title>
    </movie>
</movies>';


$movies = new SimpleXMLElement($xmlstr);

$subelement = (string)$movies->movie->title;

echo "Accesing normal: " . PHP_EOL;
echo var_dump($movies->movie->title) . PHP_EOL;
echo var_dump(empty($movies->movie->title)) . PHP_EOL;
echo "<br>";
echo "Accesing subelement: " . PHP_EOL;
echo var_dump($subelement) . PHP_EOL;
echo var_dump(empty($subelement)) . PHP_EOL; 

答案 1 :(得分:0)

首先将对象投射到字符串$subelement = (string)$movies->movie->title;,另请参阅Getting actual value from PHP SimpleXML node