【问题标题】:Pluralize array names in XML objects using simplexml使用 simplexml 复数 XML 对象中的数组名称
【发布时间】:2014-01-16 05:01:44
【问题描述】:

我正在使用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>

一旦我将 XML 代码加载到 PHP 对象中:

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

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

$xml->employee[1];

但我想复数数组的名称。这样做的主要原因是因为我想直接使用json_encode 从该 XML 对象生成 JSON,而不是生成一个新的数组/对象,其各自的名称是复数形式。

可以改变这种行为吗?如果这无法在 simplexml 内完成,那么解决此问题的最佳方法是什么?

【问题讨论】:

标签: php xml


【解决方案1】:

可以改变这种行为吗?

简短回答:不。


你会想要“用各自的复数名称生成 [something]”。无论如何,我建议不要简单地使用 json_encode()-ing SimpleXMLElement 对象。

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

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

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

【讨论】:

    【解决方案2】:

    当你说:

    但我想复数数组的名称。

    这没什么意义。 simplexml 中的 XML 解析器只是在反刍它所看到的内容。在你的 XML 结构中:

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

    确实存在一个总体&lt;employees&gt; 层次结构。但是每个员工记录中,员工存储为单数&lt;employee&gt;。它在一个适当命名为 $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"
            }
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-22
      • 2018-03-29
      • 2013-12-01
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多