Получение SimpleXMLElement для включения кодировки в вывод - PullRequest
17 голосов
/ 15 мая 2009

Это:

$XML = new SimpleXMLElement("<foo />");
echo($XML->asXML());

... выводит это:

<?xml version="1.0"?>
<foo/>

Но я также хочу вывести кодировку:

<?xml version="1.0" encoding="UTF-8"?>
<foo/>

Есть ли какой-нибудь способ сказать SimpleXMLElement включить атрибут кодирования тега <? Xml?>? Помимо этого:

$XML = new SimpleXMLElement("<?xml version='1.0' encoding='utf-8'?><foo />");
echo($XML->asXML());

Что работает, но раздражает необходимость вручную указывать версию и кодировку.

Предположим, что для целей этого вопроса я не могу вместо этого использовать DOMDocument.

Ответы [ 5 ]

20 голосов
/ 30 июля 2009

Вы можете попробовать это, но вы должны использовать simplexml_load_string для $ xml

$xml // Your main SimpleXMLElement
$xml->addAttribute('encoding', 'UTF-8');

Или вы все равно можете использовать другие средства для добавления кодировки к вашему выводу.

Простая замена

$outputXML=str_replace('<?xml version="1.0"?>', '<?xml version="1.0" encoding="UTF-8"?>', $outputXML);

Регулярные выражения

$outputXML=preg_replace('/<\?\s*xml([^\s]*)\?>/' '<?xml $1 encoding="UTF-8"?>', $outputXML);

DOMDocument - Я знаю, вы сказали, что не хотите использовать DOMDocument, но вот пример

$xml=dom_import_simplexml($simpleXML);
$xml->xmlEndoding='UTF-8';
$outputXML=$xml->saveXML();

Вы можете заключить этот код в функцию, которая получает параметр $ encoding и добавляет его к

6 голосов
/ 14 мая 2016

Просто и понятно, только сделайте это

$XMLRoot = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><element></element>');

Мощно

<?xml version="1.0" encoding="UTF-8"?>
      <element></element>

чтобы добавить атрибуты только в элемент, используйте

$XMLRoot->addAttribute('name','juan');

чтобы добавить использование ребенка

$childElement = $XMLRoot->addChild('elementChild');
$childElement->addAttribute('attribName','somthing');
1 голос
/ 15 июня 2017

Предложение DOMDoc Кристиана Тома кажется хорошим подходом, если документ не слишком тяжелый. Вы могли бы обернуть это во что-то вроде этого:

private function changeEncoding(string $xml, string $encoding) {
    $dom = new \DOMDocument();
    $dom->loadXML($xml);
    $dom->encoding = $encoding;
    return $dom->saveXML();
}

Полезно, когда у вас нет доступа к сериализатору, создающему xml.

1 голос
/ 16 мая 2009

Я бы сказал, что вам нужно будет сделать это при создании каждого объекта XML. Даже если бы у SimpleXMLElement был способ его установки, вам все равно нужно было бы установить его, так как, я думаю, объект мог бы выбрать действительное значение по умолчанию.

Может быть, создать константу и создать объекты, подобные этому

$XML = new SimpleXMLElement($XMLNamespace . "<foo />");
echo($XML->asXML());
0 голосов
/ 22 мая 2009

Если вы не укажете кодировку, SimpleXML не может (разумно) угадать, какую вы хотели.

...