【问题标题】:How to load xml file with php when CDATA isn't valid当 CDATA 无效时如何使用 php 加载 xml 文件
【发布时间】:2014-05-04 20:40:39
【问题描述】:

我正在开发一个网站,我需要加载一个 xml 文件——比如说 test.xml

XML 节点格式正确,但其中的值却不是。每个节点的值都是 CDATA 嵌套字符串(但 CDATA 并不总是格式正确)。 示例:

<root>
 <data>
   <value1><![CDATA[Some value]]></value1>
   <value2><![CDATA[ ]]></value2>
   <value3>![CDATA[  ]]></value3>
 </data>
</root>

原始的 XML 结构更复杂,但这是 CDATA 使用的示例。在节点 value3 中,CDATA 无效(在 '![CDATA' 之前缺少 '

我尝试使用以下代码加载文件

<?php
  $xml = simplexml_load_file("test.xml"); 
?>

但我收到了警告。

然后我尝试使用 LIBXML_NOCDATA,但没有改进。 我试过的第二个代码是:

<?php
  $xml = simplexml_load_file("test.xml", null, LIBXML_NOCDATA); 
  //$xml = simplexml_load_file("test.xml", 'SimpleXMLElement', LIBXML_NOCDATA); 
?>

但仍然有警告(两行)。

是否可以加载文件然后解析它(例如$xml->data->value3)?

【问题讨论】:

  • LIBXML_NOCDATA 不是灵丹妙药,与长久以来的神话相反,它实际上对 SimpleXML 毫无用处,因为 SimpleXML 本身可以很好地处理 CDATA。我在这里解释了它的作用:stackoverflow.com/a/13981917/157957 你的问题更加平凡:你破坏了 XML;损坏的位应该是 CDATA 部分这一事实无济于事,因为它们已损坏,所以它们不是。

标签: php xml cdata


【解决方案1】:

这不是有效的 XML 文件

所以你应该在使用前修复它 最简单的方法 - 是使用 PHP 中包含的 Tidy lib

<?php
error_reporting(E_ALL);
$file = '1.xml';

$tidy = new tidy();
$repaired = $tidy->repairfile($file, array(
    'input-xml' => true,
    'escape-cdata' => false
));
var_dump(simplexml_load_string($repaired));

【讨论】:

    【解决方案2】:

    如果您遇到错误的 XML,正确的方法始终是找出原因并消除根本原因。如果它是您真正无法控制的数据馈送,请认真考虑不要使用它:如果质量如此差,那么数据真的值得拥有吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 2013-03-10
      相关资源
      最近更新 更多