2009-05-15 4 views
15

Diese umfassen Anfahrt:SimpleXMLElement die Codierung in Ausgabe

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

... gibt diese:

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

Aber ich will es die Codierung Ausgang, auch:

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

Gibt es eine Möglichkeit, SimpleXMLElement mitzuteilen, dass das Codierungsattribut des Tags <? Xml?>? Abgesehen davon, das zu tun:

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

Was funktioniert, aber es ist ärgerlich, manuell die Version und Codierung festlegen zu müssen.

Nehmen Sie für die Zwecke dieser Frage an, dass ich DOMDocument stattdessen nicht verwenden kann.

+0

Warum benötigen Sie die Codierung in der Ausgabe? –

+3

Weil das eine externe Anforderung ist. :) – dirtside

Antwort

1

Ich würde sagen, dass Sie dies bei der Erstellung jedes XML-Objekts tun müssen. Selbst wenn SimpleXMLElement eine Möglichkeit hätte, es zu setzen, müssten Sie es trotzdem einstellen, da es wahrscheinlich wäre, dass das Objekt einen gültigen Standard auswählt.

Vielleicht eine Konstante erstellen und Objekte erstellen wie diese

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

Einfachste Lösung aller Zeiten, stellen Sie sicher, dass Sie "\ n" nach $ XMLNamespace hinzufügen. –

0

Wenn Sie keine Kodierung angeben, können SimpleXML nicht (sanely) erraten, welches Sie bestimmt.

+0

Ich weiß, aber die einzige Möglichkeit, eine Codierung für SimpleXML anzugeben, besteht darin, sie im Konstruktor explizit zu machen - und dann müssen Sie auch das XML-Versionsattribut angeben oder es wird ein Fehler ausgegeben. Ich kann es offensichtlich so machen, es ist einfach nervig, es überhaupt tun zu müssen. Ich denke, SimpleXML ist ein wenig zu einfach :) – dirtside

+0

Ich kann keinen Verweis darauf in der Dokumentation finden, aber ich habe den Eindruck, dass Sie * keine Codierung angeben können - weil SimpleXML UTF-8 erwartet. –

20

Sie können dies versuchen, aber Sie müssen simplexml_load_string für $ xml

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

Oder Sie können noch andere Mittel einsetzen, verwenden Sie die Codierung Ihrer Ausgabe hinzuzufügen.

Einfacher Ersatz

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

Reguläre Ausdrücke

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

DOMDocument-Ich weiß, Sie sagen, Sie wollen nicht DOMDocument verwenden, aber hier ist ein Beispiel

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

Sie diesen Code in eine Funktion wickeln kann, die einen Parameter $ encoding empfängt und fügt sie der

4

Einfach und klar, dies nur tun,

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

OutPut

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

zu Attribute nur im Element hinzufügen verwenden

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

zu Kind Verwendung

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

Der DOMDoc Vorschlag von Cristian Toma scheint einen guten Ansatz hinzufügen, wenn das Dokument nicht zu schwer ist. Man könnte es wickeln in etwa wie folgt auf:

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

in nützlich kommt, wenn Sie die XML produzieren keinen Zugriff auf den Serializer haben.