2013-08-01 42 views
0

我使用simpleXML來處理xml文件。它有西里爾字符。我還使用dom_import_simplexml,importNodeappendChild將樹從文件複製到文件並放置到位。 在處理結束時,我做print_r結果simpleXmlElement,一切都很好。但我也做asXml('outputfile.xml')和一些奇怪的事情發生了:沒有用CDATA(一些標籤主體和所有屬性)包裝的所有西里爾字符變成他們的unicode代碼。SimpleXML以奇怪的方式輸出unicode

例如,print_r輸出(只是一個片段):

SimpleXMLElement Object ([@attributes] => Array 
      ([NAME] => Государственный аппарат и  механизм 
       [COSTYES] => 3.89983579639 [COSTNO] => 0 
       [ID] => 9) 
      [COMMENTYES] => Вы совершенно   правы. 
      [COMMENTNO] => Нет, Вы ошиблись.))) 

但在文件asXml產生,我得到這樣的:

<QUEST NAME="&#x422;&#x435;&#x43E;&#x440;&#x438;&#x44F;#x434;&#x432;&#x443;&#x445;&#x43C;&#x435;&#x447;&#x435;&#x439;"  
    style="educ" ID="1"> 
    <DESC><![CDATA[Теория происхождения государства, известная как теория "двух мечей" [2, с.40], 
    представляет из себя... 
    ]]></DESC>` 

我設置使用UTF-8到處都有可能,搜索單詞「simplexml,unicode,cyrillic,asXml等」的每一個組合,但沒有任何工作。

UPD看起來像一些功能使用的是htmlentities()。所以,感謝voitcus,解決方法是使用html_entity_decode()作爲建議here

+1

請閱讀手冊中的討論(註釋):http://www.php.net/manual/en/simplexmlelement.asxml.php – Voitcus

+1

例如[this one](http://www.php.net) /manual/en/simplexmlelement.asxml.php#107137) – Voitcus

+0

謝謝,這工作。我現在想知道,我怎麼沒有自己來解決這個問題。 – ba3a

回答

2

我不知道你在開始導入xml文檔時可能不會聲明編碼。以下兩個給你不同的輸出。

$simplexml = simplexml_load_string('<QUEST NAME="Государственный" />'); 
if (!$simplexml) { exit('parse failed'); } 
print_r($simplexml->asXml()); 

$simplexml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8"?><QUEST NAME="Государственный" />'); 
if (!$simplexml) { exit('parse failed'); } 
print_r($simplexml->asXml()); 

SimpleXMLElement對象知道從原來的xml聲明自己的編碼,如果未聲明,它產生的安全數字字符引用,我猜。

+0

編碼是在xml文件中聲明的,並且相同的編碼被設置爲區域設置。問題出在'htmlentities',看到我的帖子的評論和更新。 – ba3a

+0

請運行我的示例。即使沒有CDATA,第二個也不編碼它們。您可能需要編寫最短的代碼來重現您的問題,這些問題會執行importNode/appendChild thingy。 – akky