使用simplexml在XML对象中复制数组名称

时间:2013-12-28 23:17:09

标签: php xml

我正在使用simplexml加载XML文件并以JSON格式对内容进行编码,以便我的应用程序的另一部分可以使用它。一切正常但我注意到simplexml为“数组”生成了单数名称,例如,这段XML:

<employees>
    <employee>
        <name>John M.</name>
        <age>34</age>
    </employee>
    <employee>
        <name>Sarah J.</name>
        <age>31</age>
    </employee>
</employees>

之后,我使用以下命令在PHP对象中加载XML代码:

$xml = simplexml_load_file("employees.xml");

我必须使用单数形式来访问员工阵列,例如:

$xml->employee[1];

但我想复数数组的名称。这样做的主要原因是因为我想直接使用json_encode从该XML对象生成JSON,而不是生成具有复数的相应名称的新数组/对象。

可以改变这种行为吗?如果在simplexml内无法实现这一点,那么解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

  

可以改变这种行为吗?

简答:不。


您将要“生成具有相应名称复数的[某事物] ”。无论如何,无论如何,我都会建议反对json_encode() - SimpleXMLElement个对象。

从长远来看(在你的情况下,似乎是短期)你会更好:

  • 将XML文档更改为具有多个元素名称
  • 或者,自己做一些工作,作为SimpleXML和json_encode()
  • 之间的中间步骤

对于“最好的方法”(用于将任何内容序列化为JSON),我建议您选择实现SimpleXMLElement的自己的类(可能扩展JsonSerializable)接口。其他选项包括如上所述更改XML,或者将您自己的数组/对象结构构建为JSON编码,仅举几例。

答案 1 :(得分:0)

当你说:

  

但我想复数数组的名称。

没什么意义。 simplexml中的XML解析器正在反复看到它所看到的内容。在您的XML结构中:

<employees>
    <employee>
        <name>John M.</name>
        <age>34</age>
    </employee>
    <employee>
        <name>Sarah J.</name>
        <age>31</age>
    </employee>
</employees>

确实有一个总体<employees>层次结构。但是每个员工记录,员工都存储为单数<employee>。在名为$employee的数组中返回。

如果您感到困惑,只需再执行一些XML到JSON转换的步骤即可实现目标:

$xml = simplexml_load_file("employees.xml");
$xml2json = (array) $xml;
$json_employees = json_encode(array('employees' => $xml2json['employee']));

echo '<pre>';
print_r($json_employees);
echo '</pre>';

JSON输出将是:

{
    "employees": [
        {
            "name": "John M.",
            "age": "34"
        },
        {
            "name": "Sarah J.",
            "age": "31"
        }
    ]
}