Получение элемента SimpleXMLElement для включения кодирования в вывод

Это:

$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.

Ответы

Ответ 1

Вы можете попробовать это, но вы должны использовать 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 и добавляет его в

Ответ 2

Простой и понятный только это

$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');

Ответ 3

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

Может быть, создать константу и создать объекты вроде этого

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

Ответ 4

Предложение DOMDoc Cristian Toma кажется хорошим подходом, если документ не слишком тяжелый. Вы можете обернуть его примерно так:

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

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

Ответ 5

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