将布尔值存储在xml文档中并使用PHP SimpleXML读取

时间:2011-06-30 16:00:26

标签: php xml simplexml

如何在XML文档中存储布尔值,以便您可以使用PHP的SimpleXML类读取它们?

我有以下XML文档:

<?xml version='1.0' standalone='yes'?>
<status>
<investigating></investigating>
<log>
sample log
</log>
</status>

以下php脚本来阅读它:

if (file_exists($filename)) {
    $statusXml = simplexml_load_file($filename);
        if ($statusXml) {
            $investigating = (bool)($statusXml->investigating);
            echo $investigating;
        }
} else {
    exit('Failed to open ' . $filename .'.');
}

无论我放在标签中,它总是被读为真。我试过“0”,空字符串,“假”和其他一些想法,但没有任何效果。我认为空字符串应该是因为我在本文档中找到的内容:http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

3 个答案:

答案 0 :(得分:6)

考虑到:

  1. XML数据始终是字符串
  2. PHP类型转换规则可能非常违反直觉
  3. ......我不会依赖自动型杂耍。简单地说,定义一个您熟悉的语法,在读取时转换为字符串并编写您自己的代码以转换为布尔值。

    <?php
    
    function get_bool($value){
        switch( strtolower($value) ){
            case 'true': return true;
            case 'false': return false;
            default: return NULL;
        }
    }
    
    $data = '<?xml version="1.0"?>
    <data>
        <empty_tag/>
        <true_tag>true</true_tag>
        <false_tag>false</false_tag>
    </data>
    ';
    
    $xml = simplexml_load_string($data);
    var_dump( get_bool((string)$xml->empty_tag) );
    var_dump( get_bool((string)$xml->true_tag) );
    var_dump( get_bool((string)$xml->false_tag) );
    

    无论如何,如果您对如何使(bool)工作感到好奇,那么您基本上是在处理对象,因此这是在转换为布尔值时应用的规则:

    • 从空标签创建的SimpleXML对象:FALSE
    • 其他每个值:TRUE

    这意味着您只能FALSE使用<investigating />TRUE以及其他任何内容)。我可以想到的扩大可能的TRUE值范围的技巧是执行双重投射:

    (bool)(string)$xml->investigating
    

    更新:不要忘记使用var_dump()进行调试。如果您使用echo,您会发现TRUE布尔转换为'1'字符串,FALSE转换为''(空字符串)。

答案 1 :(得分:-1)

你没有抓住正确的元素。

if (file_exists($filename)) {
    $statusXml = simplexml_load_file($filename);
    if ($statusXml = simplexml_load_file($filename)) {
        $investigating = (bool) $statusXml->investigating[0];
        echo $investigating;
    }
}

答案 2 :(得分:-1)

这是相当陈旧的,以防万一有人正在寻找答案。你可以使用:

<example is-true=1>

<example is-true=0>

这应该可以正常工作。

如果在其上使用if语句,则使用<example is-true="0">的注释将返回true。