Получение элемента 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.

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

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

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

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

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

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

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

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

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

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