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

Ket*_*tan 5 php xml json

如果我使用以下php代码将转换xmljson:

<?php

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

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

$sxml = simplexml_load_string($resultXML);
echo  json_encode($sxml);
?>
Run Code Online (Sandbox Code Playgroud)

我明白了

{"Company":"fcsf","Details":"\n      fgrtgrthtyfgvb\n   "}
Run Code Online (Sandbox Code Playgroud)

但是,如果我CDATADetails元素中使用如下:

<?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);
Run Code Online (Sandbox Code Playgroud)

?>

我得到以下内容

{"Company":"fcsf","Details":{}}
Run Code Online (Sandbox Code Playgroud)

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

CBr*_*roe 25

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

object(SimpleXMLElement)#2 (0) {
}
Run Code Online (Sandbox Code Playgroud)

- 一个"空"的SimpleXMLElement,那里已经缺少CDATA内容.

我们想出来之后(好吧,可以,如果你只是正确地分析了问题),谷歌搜索"simplexml cdata"引导我们直接到SimpleXML函数手册页上的第一个用户评论,它有解决方案:

如果您在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);
Run Code Online (Sandbox Code Playgroud)

在你的代码中,你会得到

{"Company":"fcsf","Details":"\n      fgrtgrthtyfgvb\n   "}
Run Code Online (Sandbox Code Playgroud)

经过JSON编码后.