0

我使用 simpleXML 来处理 xml 文件。它有西里尔字母。我也使用dom_import_simplexml,importNodeappendChild将树从一个文件复制到另一个文件,从一个地方复制到另一个地方。在处理结束时,我print_r对结果进行了处理simpleXmlElement,一切正常。但是我也这样做asXml('outputfile.xml')了,并且发生了一些奇怪的事情:所有未包装的西里尔字符CDATA(一些标签主体和所有属性)都更改为它们的 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、西里尔文、asXml 等”的每个组合,但没有任何效果。

UPD看起来像使用了某些功能htmlentities()。因此,感谢voitcus,解决方案是html_entity_decode()按照此处的建议使用。

4

1 回答 1

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 声明中知道自己的编码,如果没有声明,它会生成数字字符引用以确保安全,我猜。

于 2013-08-02T01:41:49.093 回答