SimpleXml не может создать недопустимый XML, поэтому любые атрибуты с закодированными правами не могут быть преобразованы после импорта. Рассмотрим этот тестовый пример:
$xml = <<< XML
<root>
<element attr="3 & 5 are < 9 but > 6"/>
</root>
XML;
$root = simplexml_load_string($xml);
echo $root->asXml();
Выше будет дано:
<?xml version="1.0"?>
<root>
<element attr="3 & 5 are < 9 but > 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 & 5 are < 9 but > 6"/>
<element attr="3 & 5 are < 9 but > 6">
3 & 5 are < 9 but > 6
</element>
</root>
Так что не должно быть никаких проблем. Фактически, при попытке вернуть htmlencoded-сущности обратно в XML, они будут испорчены, потому что сущности начинаются с амперсанда, и это затем кодируется, например, в & lt;, что приводит к строке типа
&amp; 5 are &lt; 9 but &gt; 6
Редактировать после обновления
Примечание. SimpleXml автоматически обрабатывает только &,>, <и ", поскольку они определены как права для XML. Показанные вами кодировки символов не являются. Следовательно, при использовании UTF-8 не должно быть необходимости использовать их как символы кодировки, потому что XML все равно будет действительным. Если ваш потребительский код требует этих сущностей, я бы предложил обработать преобразование в потребляющем коде, а не принудительно вводить их в XML. </p>