当CDATA无效时,如何使用php加载xml文件

时间:2014-05-04 20:40:40

标签: php xml cdata

我正在开发一个网站,我需要加载一个xml文件 - 让我们说一下test.xml

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

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

原始XML结构更复杂,但这是CDATA使用的示例。在节点值3中,CDATA无效(在#CD;&#39;之前缺少&#39;&lt;&#39;字符。

;

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

<?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-&gt; data-&gt; value3)?

2 个答案:

答案 0 :(得分:0)

这不是有效的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));

答案 1 :(得分:0)

如果你得到错误的XML,正确的方法总是找出原因,并消除根本原因。如果它是您真正无法控制的数据源,请认真考虑不使用它:如果质量太差,数据真的值得拥有吗?