php json_encode在php 5.4中改变了行为

时间:2014-04-11 11:18:02

标签: php xml json

我有以下xml

$resultXML=<<<XML

<Mapper ProviderCode="" ProviderName="" SessionID="" Supplier="" ProviderSupplier="">
<ProviderSupplierName/>
</Mapper>

XML;

当我发出:

$sxml = simplexml_load_string($resultXML);
echo json_encode($sxml);

PHP Version 5.3.3-7+squeeze15中,我得到了:

"Mapper": {
    "@attributes": {
        "ProviderCode": "",
        "ProviderName": "",
        "SessionID": "",
        "Supplier": "",
        "ProviderSupplier": ""
    },
    "ProviderSupplierName": {}
}

PHP Version 5.4.4-14+deb7u8中,我得到:

"Mapper": {
    "0": {},
    "@attributes": {
        "ProviderCode": "",
        "ProviderName": "",
        "SessionID": "",
        "Supplier": "",
        "ProviderSupplier": ""
    }
}

我想使用PHP Version 5.4.4-14+deb7u8并获得与PHP Version 5.3.3-7+squeeze15相同的结果。

实际上这个xml是很长的xml的一部分。当我在这种情况下提取它时,我在两个版本的php上得到类似的结果。

可以在https://drive.google.com/file/d/0B9zOzk6voXHKQ3N1ZklfVFVITFU/edit?usp=sharing

找到完整的xml

我注意到的另一件事是,如果我使用链接中给出的xml,我会在第二个示例中获得json,但是如果我使用xml格式化器并格式化xml,那么我在第一个示例中获取json

任何帮助?

1 个答案:

答案 0 :(得分:3)

您只需要<ProviderSupplierName/>标记来重现该问题,正如您已经提到的那样,reformat the source XML and add white space around it时会发生不同的输出:

<Hotels>
    <Hotel>
        <Mapper><ProviderSupplierName/></Mapper>
    </Hotel>
</Hotels>
{"Hotel":{"Mapper":{"0":{}}}}
<Hotels>
    <Hotel>
        <Mapper>
            <ProviderSupplierName/>
        </Mapper>
    </Hotel>
</Hotels>
{"Hotel":{"Mapper":{"ProviderSupplierName":{}}}}

要获得coherent pre-PHP/5.4 automated parsing,您可以提供LIBXML_NOBLANKS标记(«删除空白节点»):

$sxml = simplexml_load_string($resultXML, 'SimpleXMLElement', LIBXML_NOBLANKS);

(很难说改变是否是故意的,但消失的标签名称感觉就像一个错误。)