【发布时间】:2014-02-28 15:28:35
【问题描述】:
我正在尝试将配置文件加载为 XML 或 JSON。我知道这是在重新发明轮子,但我正在尝试习惯一些我从未使用过的模式。
我的问题是我想不出一种方法来通知 SimpleXML_Load_File 当元素仅出现 1 次时,该元素应被视为数组而不是对象。
考虑以下 JSON:
{
"database" :
{
"name" : "MyDB",
"driver" : "MySQL",
"table" :
[
{
"name" : "user",
"engine" : "MyISAM",
"column" :
[
{
"name" : "username",
"type" : "varchar",
"size" : "25"
},
{
"name" : "password",
"type" : "varchar",
"size" : "60"
}
]
}
]
}
}
以及相关的XML:
<config>
<database>
<name>MyDB</name>
<driver>MySQL</driver>
<table>
<name>user</name>
<engine>MyISAM</engine>
<column>
<name>username</name>
<type>varchar</type>
<size>25</size>
</column>
<column>
<name>password</name>
<type>varchar</type>
<size>60</size>
</column>
</table>
</database>
</config>
除了<config> 元素之外,这些配置是相同的——由于SimpleXML 处理根级别元素的方式,我添加了它。
对于 JSON,您使用 [ ] 指定一个数组,json_decode 将使相应的元素成为一个对象数组(例如 table) - 但是对于 XML,我无法做到这一点告诉 - 这个例子中SimpleXML_Load_File 的结果是table 将是一个对象,而不是json_decode 返回的预期(我)的对象数组
我觉得我可能必须对应该是数组而不是对象的元素进行类型测试和转换,但我也觉得这可能会变得非常混乱。
这是用于加载这些文件的相关代码:
<?php $config_xml = simplexml_load_file( 'database.config.xml' ); ?>
<?php $config_json = json_decode( file_get_contents('database.config.json'), false ); ?>
结果:
$config_xml->database->table - 对象
$config_json->database->table - 对象数组
【问题讨论】:
-
这并不像您想象的那么简单。 SimpleXMLElement 如何转换为 JSON 以及如何修改我在一篇由三部分组成的博客文章中概述的内容:SimpleXML and JSON Encode in PHP – Part I。如果您阅读了第一部分和第二部分,您可能能够更好地理解第三部分,它广泛地展示了如何更改 XML 的 JSON 表示。但是,我不太确定您尝试做的事情是否可以以一般方式进行。最有可能...
-
...然后您的代码包含您想要作为数组的元素名称的“幻数”。
标签: php xml arrays json object