2014-05-04 16 views
0

我正在開發一個網站的有效,我需要加載XML文件 - 讓我們說的test.xml如何加載XML文件用PHP時CDATA不是

XML節點是公格式化,但裏面的值他們不是。每個節點的值都是CDATA嵌套字符串(但CDATA並不總是合適的)。 實施例:

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

原始XML結構是更復雜的,但是這是CDATA用法的例子。在節點值3中,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)?

+0

LIBXML_NOCDATA不是一個神奇的子彈,而且與持久的神話相反,它對於SimpleXML實際上是沒用的,因爲SimpleXML本身很好地處理CDATA。我在這裏解釋了一下它的作用:http://stackoverflow.com/a/13981917/157957你的問題更爲普遍:你破壞了XML;事實上,破碎的位*應該是CDATA部分並沒有幫助,因爲它們被破壞了,所以它們不是。 – IMSoP

回答

0

這不是有效的XML文件

所以你使用 之前應該修復它最簡單的方法 - 就是使用包含在PHP

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

如果你得到不好的XML權整潔的lib方法總是找出原因,並消除根本原因。如果這是一種您真正無法控制的數據饋送,請認真考慮不使用它:如果質量很差,數據真的值得嗎?