php - 当有CDATA时,将xml转换为json不起作用

时间:2014-02-04 09:27:14

标签: php xml json

如果我使用以下php代码将xml转换为json

<?php

header("Content-Type:text/json");

$resultXML = "
<QUERY>
   <Company>fcsf</Company>
   <Details>
      fgrtgrthtyfgvb
   </Details>
</QUERY>
";

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

我得到了

{"Company":"fcsf","Details":"\n      fgrtgrthtyfgvb\n   "}

但是,如果我在CDATA元素中使用Details,如下所示:

<?php

header("Content-Type:text/json");

$resultXML = "
<QUERY>
   <Company>fcsf</Company>
   <Details><![CDATA[
      fgrtgrthtyfgvb]]>
   </Details>
</QUERY>
";

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

&GT;

我得到以下

{"Company":"fcsf","Details":{}}

在这种情况下,Details元素为空。知道为什么Details是空白的,以及如何纠正这个问题?

1 个答案:

答案 0 :(得分:23)

这是 JSON编码的问题 - var_dump($sxml->Details)向您展示SimpleXML之前已经弄乱了它,因为您只会获得

object(SimpleXMLElement)#2 (0) {
}

- 一个“空”的SimpleXMLElement,那里已经缺少CDATA内容。

之后我们想出来(好吧,可能有,如果你只是正确地分析了问题 ),谷歌搜索“ simplexml cdata“直接引导我们the first user comment on the manual page on SimpleXML Functions,它有解决方案:

  

如果您在simplexml文档中访问CDATA时遇到问题,则在使用simplexml加载CDATA之前,不需要str_replace / preg_replace CDATA。

     

您可以改为执行此操作,并将所有CDATA内容作为字符串合并到元素内容中。

     

$xml = simplexml_load_file($xmlfile, 'SimpleXMLElement', LIBXML_NOCDATA);

所以,使用

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

在您的代码中,您将获得

{"Company":"fcsf","Details":"\n      fgrtgrthtyfgvb\n   "}
在对JSON进行编码之后