Эта:
$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 не может (разумно) угадать, какой из них вы планировали.