2009-05-15 5 views
15

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

+0

Зачем вам нужна кодировка, присутствующая в выходе? –

+3

Потому что это внешнее требование. :) – dirtside

ответ

1

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

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

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

Самое простое решение когда-либо, просто убедитесь, что вы добавили «\ n» после $ XMLNamespace. –

0

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

+0

Я знаю, но единственный способ указать кодировку для SimpleXML - сделать его явным в конструкторе - и тогда вам также нужно указать атрибут XML-версии, или он выдает ошибку. Я, очевидно, могу так поступать, просто надоело делать это вообще. Я думаю, SimpleXML слишком прост :) – dirtside

+0

Я не могу найти ссылки на это в документации, но у меня сложилось впечатление, что вы * не можете * указать кодировку, потому что SimpleXML ожидает UTF-8. –

20

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

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

4

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

$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

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

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

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

Смежные вопросы