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

Ank*_*kur 7 php xml simplexml

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

我有以下XML文档:

<?xml version='1.0' standalone='yes'?>
<status>
<investigating></investigating>
<log>
sample log
</log>
</status>
Run Code Online (Sandbox Code Playgroud)

以下php脚本来阅读它:

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

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

Álv*_*lez 7

考虑到:

  1. XML数据始终是一个字符串
  2. PHP类型的转换规则可能非常违反直觉

......我不会依赖自动型杂耍.简单地说,定义一个您熟悉的语法,在读取时转换为字符串并编写您自己的代码以转换为布尔值.

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

无论如何,如果你对如何(bool)工作感到好奇,你基本上是在处理对象,所以这是在转换为布尔值时适用的规则:

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

这意味着,你将只能得到FALSE<investigating />(和TRUE具有绝对别的).我可以想到的扩大可能的TRUE值范围的技巧是执行双重转换:

(bool)(string)$xml->investigating
Run Code Online (Sandbox Code Playgroud)

更新:不要忘记调试var_dump().如果你使用echo你会发现,TRUE布尔强制转换为'1'字符串,并FALSE''(空字符串).