1

我使用 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。

为什么如果我在变量中传递元素与传递从主元素加入的元素时,空的行为会有所不同?

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

4

2 回答 2

1

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

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

if($subelement == "")

或者

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

但是,如果您empty()在转换为字符串后使用(可能)另一个问题是,如果您的电影标题是 eg0或其他一些似乎为空的(数字)字符串也是如此,请参阅: 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; 
于 2013-05-31T09:51:33.437 回答
0

首先将您的对象转换为字符串$subelement = (string)$movies->movie->title;,另请参阅从 PHP SimpleXML 节点获取实际值

于 2013-05-31T09:48:42.453 回答