我使用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中检查元素是否为空的正确方法是什么?
答案 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