23 votes

Obtenir que SimpleXMLElement inclue l'encodage dans la sortie

Ceci :

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

...sort ceci :

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

Mais je veux qu'il affiche également l'encodage :

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

Existe-t-il un moyen de demander à SimpleXMLElement d'inclure l'attribut encoding de la balise <?xml?> ? A part faire ceci :

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

Ce qui fonctionne, mais il est ennuyeux de devoir spécifier manuellement la version et l'encodage.

Supposons, pour les besoins de cette question, que je ne puisse pas utiliser DOMDocument à la place.

24voto

Cristian Toma Points 3338

Vous pouvez essayer, mais vous devez utiliser simplexml_load_string pour $xml

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

Vous pouvez également utiliser d'autres moyens pour ajouter l'encodage à votre sortie.

Remplacement simple

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

Expressions régulières

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

DOMDocument - Je sais que vous avez dit que vous ne vouliez pas utiliser DOMDocument, mais voici un exemple

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

Vous pouvez intégrer ce code dans une fonction qui reçoit un paramètre $encoding et l'ajoute à l'élément

15voto

DarckBlezzer Points 1692

La simplicité et la clarté ne font que cela

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

Sortie

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

pour ajouter des attributs à un élément, utilisez uniquement

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

pour ajouter l'utilisation de l'enfant

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

4voto

LevinM Points 36

La proposition DOMDoc de Cristian Toma semble être une bonne approche si le document n'est pas trop lourd. Vous pourriez le résumer de la manière suivante :

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

Il est utile lorsque vous n'avez pas accès au sérialiseur produisant le xml.

1voto

Toby Allen Points 6734

Je dirais que vous devrez le faire lors de la création de chaque objet XML. Même si SimpleXMLElement avait un moyen de le définir, vous devriez quand même le faire car je suppose qu'il serait possible pour l'objet de choisir une valeur par défaut valide.

Il est possible de créer une constante et de créer des objets comme suit

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

0voto

TML Points 6469

Si vous ne spécifiez pas d'encodage, SimpleXML ne peut pas (raisonnablement) deviner celui que vous avez voulu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X