2009-05-15 10 views
15

Este:SimpleXMLElement para incluir la codificación de la producción

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

... Muestra esto:

<?xml version="1.0"?> 
<foo/> 

Pero lo quiero dar salida a la codificación, también:

<?xml version="1.0" encoding="UTF-8"?> 
<foo/> 

¿Hay alguna forma de decirle a SimpleXMLElement que incluya el atributo de codificación de la etiqueta <? Xml?>? Aparte de hacer esto:

$XML = new SimpleXMLElement("<?xml version='1.0' encoding='utf-8'?><foo />"); 
echo($XML->asXML()); 

que funciona, pero es molesto tener que especificar manualmente la versión y la codificación.

Supongamos a los fines de esta pregunta que no puedo usar DOMDocument en su lugar.

+0

¿Por qué necesita la codificación presente en la salida? –

+3

Porque es un requisito externo. :) – dirtside

Respuesta

1

Yo diría que tendrá que hacer esto en la creación de cada objeto XML. Incluso si SimpleXMLElement tuviera una forma de configurarlo, igual tendría que configurarlo, ya que supongo que sería posible que el objeto elija un valor predeterminado válido.

Tal vez crean una constante y crear objetos como éste

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

La solución más fácil de todas, solo asegúrese de agregar "\ n" después de $ XMLNamespace. –

0

Si no se especifica una codificación, SimpleXML no puede (sanamente) adivinar cuál se pretende.

+0

Lo sé, pero la única forma de especificar una codificación para SimpleXML es hacerla explícita en el constructor, y luego también debe especificar el atributo de versión XML, o arroja un error. Obviamente puedo hacerlo de esa manera, es molesto tener que hacerlo en absoluto. Supongo que SimpleXML es un poco demasiado simple :) – dirtside

+0

No puedo encontrar ninguna referencia a esto en la documentación pero tengo la impresión de que * no puede * especificar una codificación, porque SimpleXML espera UTF-8. –

20

usted puede probar esto, pero debe utilizar simplexml_load_string por $ xml

$xml // Your main SimpleXMLElement 
$xml->addAttribute('encoding', 'UTF-8'); 

O todavía se puede utilizar otros medios para añadir la codificación a su salida.

simple sustitución

$outputXML=str_replace('<?xml version="1.0"?>', '<?xml version="1.0" encoding="UTF-8"?>', $outputXML); 

expresiones regulares

$outputXML=preg_replace('/<\?\s*xml([^\s]*)\?>/' '<?xml $1 encoding="UTF-8"?>', $outputXML); 

DOMDocument - Sé que dijo que no desea utilizar DOMDocument, pero aquí es un ejemplo

$xml=dom_import_simplexml($simpleXML); 
$xml->xmlEndoding='UTF-8'; 
$outputXML=$xml->saveXML(); 

Usted puede envolver el código en una función que recibe un parámetro $ codificación y lo añade a la

4

simple y clara solamente hacer esto

$XMLRoot = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><element></element>'); 

OutPut

<?xml version="1.0" encoding="UTF-8"?> 
     <element></element> 

a agregar atributos en el elemento solo use

$XMLRoot->addAttribute('name','juan'); 

para añadir uso infantil

$childElement = $XMLRoot->addChild('elementChild'); 
$childElement->addAttribute('attribName','somthing'); 
1

La propuesta DOMDoc de Cristian Toma parece un buen método si el documento no es demasiado pesado. Se podría envolverlo en algo como esto:

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

resulta muy útil cuando usted no tiene acceso al serializador producir el código XML.

Cuestiones relacionadas