2010-05-09 63 views
2

。 XML看起來像這樣:CDATA部分沒有完成的問題

<?xml version="1.0" encoding="utf-8"?> 
<quizzes> 
<quizz> 
<title><![CDATA[Title]]></title> 
<descr><![CDATA[Some text here!]]></descr> 
<tags><![CDATA[one tag, second tag]]></tags> 
<image><![CDATA[http://www.site.org/displayimage.php?album=search&cat=0&pos=1]]></image> 
<results> 
<result> 
<title><![CDATA[Something]]></title> 
<descr><![CDATA[Some text here]]></descr> 
<image><![CDATA[http://www.site.org/displayimage.php?album=search&cat=0&pos=17]]></image> 
<id>1</id> 
</result> 
</results> 
</quizz> 
</quizzes> 

你能幫我發現是什麼問題嗎?

+0

「XML看起來像這樣」 - 「看起來像「或」完全是「?如果您不希望我們看到實際的網址,則可能不僅要更改文檔,還要更改錯誤消息。 – VolkerK 2010-05-09 16:30:21

+0

@VolkerK謝謝,我不想在這裏發佈任何網站。 – 2010-05-10 14:48:49

回答

-1

我已經發現問題是在PHP通過這個XML具有捲曲。我將它作爲普通文本發送,並且此XML中的char被解釋爲下一個參數的分隔符。所以當我逃脫這個字符時,它開始正常工作。

+4

如何轉義它,請將代碼/細節添加到您的答案中。 – WonderLand 2016-03-18 09:23:23

-1

我沒有看到任何錯誤(實際使用的XML與所提供的或所使用的xml處理器不同(順便說一句,它是什麼?)是越野車)。

我建議避免使用CDATA部分。使用下面的XML文檔,這是一樣的(文本相當於)提供的,並且更可讀:

<quizzes> 
    <quizz> 
     <title>Title</title> 
     <descr>Some text here!</descr> 
     <tags>one tag, second tag</tags> 
     <image>http://www.site.org/displayimage.php?album=search&amp;cat=0&amp;pos=1</image> 
     <results> 
     <result> 
      <title>Something</title> 
      <descr>Some text here</descr> 
      <image>http://www.site.org/displayimage.php?album=search&amp;cat=0&amp;pos=17</image> 
      <id>1</id> 
     </result> 
     </results> 
    </quizz> 
</quizzes> 
+1

如果您正在解析從第三方源提供給您的XML,那麼這不是一個真正的選項 – chiliNUT 2017-04-24 23:57:15

2

對不起,如果這是脫離主題,因爲它只與PHP使用cURL時的特定情況有關,但作爲tomaszs狀態,我也發現在PHP中通過cURL傳遞XML時,&符號可能導致問題。我一直在收到一個已知的有效XML字符串,並且正確編碼,然後使用cURL將其轉發到另一個地址。類似這樣的...

$curlHandle = curl_init(); 
curl_setopt($curlHandle, CURLOPT_URL,   $fullUri); 
curl_setopt($curlHandle, CURLOPT_HEADER,   false); 
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT, 4); // seconds 
curl_setopt($curlHandle, CURLOPT_POST,   true); 
curl_setopt($curlHandle, CURLOPT_POSTFIELDS,  "xmlstr=" . $xmlstr); // Problem 

將上述最後一行添加到CURLOPT_POSTFIELDS中時,會發生此問題。第一個編碼的&符號被視爲一個參數的分隔符,如在一個querstring中,並且「xmlstr」變量/字段被截斷。

我使用的解決方案是,以取代上面的最後一行...

curl_setopt($curlHandle, CURLOPT_POSTFIELDS,  "xmlstr=" . urlencode($xmlstr)); 

希望這可以幫助別人。

3

我發現,通常有隱藏XML字符的問題,所以我更喜歡逃避無效字符像敬愛:

<?php 
//$feedXml is the fetched XML content 
$invalid_characters = '/[^\x9\xa\x20-\xD7FF\xE000-\xFFFD]/'; 
$feedXml = preg_replace($invalid_characters, '', $feedXml); 
0

的答案在這裏有個好主意:有某種不好的,可能非打印文檔中的字符,這打破瞭解析器。上述解決我的問題的答案都不對,而不是我用tr寫入文件的一個「乾淨」的版本,然後我就能夠解析,即

<?php 
try { 
    $simpleXMLobject = simplexml_load_file($feed); 
} catch (\Exception $ex) { 
    //try to clean the file and reload it 
    $tempFile = sys_get_temp_dir() . "/" . uniqid("rdc"); 
    shell_exec(
     "tr -cd '\11\12\15\40-\176' < " . 
     escapeshellarg($feed) . " > " . 
     escapeshellarg($tempFile) 
    ); 
    try { 
     $simpleXMLobject = simplexml_load_file($tempFile); 
    } catch (\Exception $ex) { 
     $err = $ex->getTraceAsString(); 
     echo die($err); 
    } 
}