我有以下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
任何帮助?
答案 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);
(很难说改变是否是故意的,但消失的标签名称感觉就像一个错误。)