2013-08-01 6 views
0

XML 파일을 처리하는 데 simpleXML을 사용합니다. 그것은 키릴 문자가 있습니다. 또한 dom_import_simplexml, importNodeappendChild을 사용하여 파일에서 파일로 트리를 복사하고 배치 할 수 있습니다. 처리가 끝나면 print_r의 결과는 simpleXmlElement이며 모든 것이 정상입니다. 하지만 나는 asXml('outputfile.xml')을하고 이상한 일이 일어나고 있습니다. CDATA (일부 태그 본문과 모든 속성)으로 묶이지 않은 모든 키릴 문자는 유니 코드 코드로 바뀝니다.SimpleXML이 이상한 방식으로 유니 코드를 출력합니다

예를 들어, print_r의 출력 (단지 조각) :

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

그러나 asXml가 생성하는 파일의

, 난 이런 식으로 뭔가를 얻을 : 나는 UTF-8 로케일을 설정
<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>` 

도처에 가능하다면 "simplexml, unicode, cyrillic, asXml 등"의 모든 조합을 봤지만 아무것도 작동하지 않았습니다.

UPD 사용되는 일부 기능처럼 보입니다 htmlentities(). 따라서 voitcus 덕분에 해결책은 here으로 html_entity_decode()을 사용하는 것입니다.

+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

관련 문제