关于PHP XML转换Json解决方案以及一些坑

最近项目中需要将原项目中的XML转换成Json,在PHP中我们将xml转换成json 需要用到以下两个函数simplexml_load_string 、 json_encode

simplexml_load_string() 函数转换形式良好的 XML 字符串为 SimpleXMLElement 对象。

json_encode 函数 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE

常规转换json

$selectionsXml = simplexml_load_string($selections, 'SimpleXMLElement', LIBXML_NOCDATA);
$json = json_encode($selectionsXml,JSON_UNESCAPED_UNICODE);

这样就成功到将XML转换成为了JSON.

但是如果XML格式是UTF-16编码的可能就会出一个问题

XML格式:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfSelection xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Selection>
    <Text> 傣族</Text>
    <Value>A</Value>
  </Selection>
  <Selection>
    <Text> 苗族</Text>
    <Value>B</Value>
  </Selection>
  <Selection>
    <Text> 白族</Text>
    <Value>C</Value>
  </Selection>
  <Selection>
    <Text> 壮族</Text>
    <Value>D</Value>
  </Selection>
</ArrayOfSelection>

这个时候我们转换会触发一个错误:simplexml_load_string(): Entity: line 1: parser error : Document labelled UTF-16 but has UTF-8 content

WX20181202-232025@2x.png

经过各种找办法,百度谷歌无解,最终通过自己找到两个解决方案:

方案1:

我们直接将encoding="utf-16"替换为"utf-8"即可进行正常转换:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSelection xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  ******
</ArrayOfSelection>

方案2:

mb_convert_encoding 是php内置的编码转换函数 官方文档:http://www.php.net/manual/zh/function.mb-convert-encoding.php

我们只需要在转换json之前 重新转码一次就可以了.

$selections = mb_convert_encoding($selections, 'UTF-16', 'UTF-8');
$selectionsXml = simplexml_load_string($selections, 'SimpleXMLElement', LIBXML_NOCDATA);
//json
$selections = json_encode($selectionsXml,JSON_UNESCAPED_UNICODE);

正常输出转换:

WX20181202-232817@2x.png

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容