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