【问题标题】:php - converting xml to json does not work when there is CDATAphp - 当有 CDATA 时,将 xml 转换为 json 不起作用
【发布时间】:2014-02-04 09:27:13
【问题描述】:

如果我使用以下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   "}

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

<?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);

?>

我得到以下内容

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

在这种情况下,Details 元素为空白。知道为什么 Details 为空白以及如何更正吗?

【问题讨论】:

  • 您之前尝试过删除 ![CDATA[ 和 ]] 吗? $resultXML =str_replace('', '', $resultXML);

标签: php xml json


【解决方案1】:

不是 JSON 编码的问题 - var_dump($sxml-&gt;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 内容将作为字符串合并到元素内容中。

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

所以,使用

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

在你的代码中,你会得到

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

在对其进行 JSON 编码之后。

【讨论】:

  • 这个答案的第一句话是错误的:SimpleXML parsed CData 节点就好了,但是var_dumpjson_encode output 都没有它。如果你直接访问它,用(string) 询问字符串内容,你会看到它就在那里:3v4l.org/c2FoQ 盲目地将 XML 转换为 JSON 根本不是 SimpleXML 的设计目标之一,而这只是其中之一尝试使用它时会遇到几个问题。
猜你喜欢
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 2012-02-08
  • 2018-01-26
  • 2012-02-02
  • 1970-01-01
相关资源
最近更新 更多