Сохранить кодировку в SimpleXML - PullRequest
0 голосов
/ 30 марта 2011

Я загружаю файл XML в SimpleXML.Затем файл SimpleXML преобразуется в другой макет XML и записывается на диск.

Исходный файл XML имеет такие атрибуты, как &amp; &lt; &gt;, в пределах значений атрибутов и значений элементов.При импорте в SimpleXML они изменяются на & <>.Мне нужно сохранить исходную кодировку при выводе в новый макет XML.

Есть ли способ помешать SimpleXML изменить эти значения или легко сбросить их после импорта.

Пример исходного XML

<?xml version="1.0" encoding="UTF-8"?>
<Players> 
   <Player id="12134" first_name="Dave" last_name="O&#39;Shea" />    
</Players>

SimpleXML

SimpleXMLElement Object
(
    [Player] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [id] => 12134
                    [first_name] => Dave
                    [last_name] => O'Shea
                )

        )

)

Пример необходимого вывода

<xu:List> 
   <xu:Item id="5687" name="Dave O&#39;Shea" />    
</xu:List>

Мне нужно сохранить значение O & # 39;Ши вместо О'Ши.У меня нет контроля над исходным XML.Это просто пример того, что фактический XML-файл намного больше, и мне нужно применить его к любому атрибуту или значению.

Возможно ли это?

1 Ответ

0 голосов
/ 30 марта 2011

SimpleXml не может создать недопустимый XML, поэтому любые атрибуты с закодированными правами не могут быть преобразованы после импорта. Рассмотрим этот тестовый пример:

$xml = <<< XML
<root>
    <element attr="3 &amp; 5 are &lt; 9 but &gt; 6"/>
</root>
XML;
$root = simplexml_load_string($xml);
echo $root->asXml();

Выше будет дано:

<?xml version="1.0"?>
<root>
    <element attr="3 &amp; 5 are &lt; 9 but &gt; 6"/>
</root>

Как видите, атрибуты все еще закодированы. Это только когда вы вытаскиваете их с

$attr = $root->element['attr'];
echo $attr; 

что они не закодированы в 3 & 5 are < 9 but > 6. Если вы этого не хотите, пропустите строку через htmlspecialchars, чтобы перекодировать сущности. Но поскольку SimpleXml не может создать недопустимый XML, вам не нужно перекодировать их, когда они помещаются в любое место XML, которое требует их кодирования, например

$root->element[]['attr'] = $attr; // create new element with attribute
$root->element[1] = $attr;        // add attribute as element node value
echo $root->asXml();

приведет к (отформатирован вручную для удобства чтения)

<?xml version="1.0"?>
<root>
    <element attr="3 &amp; 5 are &lt; 9 but &gt; 6"/>
    <element attr="3 &amp; 5 are &lt; 9 but &gt; 6">
        3 &amp; 5 are &lt; 9 but &gt; 6
    </element>
</root>

Так что не должно быть никаких проблем. Фактически, при попытке вернуть htmlencoded-сущности обратно в XML, они будут испорчены, потому что сущности начинаются с амперсанда, и это затем кодируется, например, в & lt;, что приводит к строке типа

&amp;amp; 5 are &amp;lt; 9 but &amp;gt; 6

Редактировать после обновления

Примечание. SimpleXml автоматически обрабатывает только &,>, <и ", поскольку они определены как права для XML. Показанные вами кодировки символов не являются. Следовательно, при использовании UTF-8 не должно быть необходимости использовать их как символы кодировки, потому что XML все равно будет действительным. Если ваш потребительский код требует этих сущностей, я бы предложил обработать преобразование в потребляющем коде, а не принудительно вводить их в XML. </p>

...