2009-05-15 8 views
15

questo:Ottenere SimpleXMLElement per includere la codifica in uscita

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

... Risulterà:

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

Ma voglio che la codifica in uscita, anche:

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

C'è un modo per dire a SimpleXMLElement di includere l'attributo di codifica del tag <? Xml?>? Oltre a fare questo:

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

Che funziona, ma è fastidioso dover specificare manualmente la versione e la codifica.

Si supponga ai fini di questa domanda che non sia possibile utilizzare DOMDocument.

+0

Perché è necessaria la codifica presente nell'output? –

+3

Perché questo è un requisito esterno. :) – dirtside

risposta

1

Direi che dovrai eseguire questa operazione alla creazione di ciascun oggetto XML. Anche se SimpleXMLElement avesse un modo di impostarlo, avresti comunque bisogno di impostarlo in quanto credo che sarebbe possibile per l'oggetto scegliere un valore predefinito valido.

Forse creare un costante e creare oggetti come questo

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

La soluzione più semplice di sempre, assicurati di aggiungere "\ n" dopo $ XMLNamespace. –

0

Se non si specifica una codifica, SimpleXML non può (in modo sano) indovinare quale previsto.

+0

Lo so, ma l'unico modo per specificare una codifica per SimpleXML è renderlo esplicito nel costruttore - e quindi devi specificare anche l'attributo della versione XML o genera un errore. Ovviamente posso farlo in quel modo, è solo fastidioso doverlo fare a tutti. Immagino che SimpleXML sia un po 'troppo semplice :) – dirtside

+0

Non riesco a trovare alcun riferimento a questo nella documentazione, ma ho l'impressione che * non sia * possibile specificare una codifica, poiché SimpleXML si aspetta UTF-8. –

20

Si può provare questo, ma è necessario utilizzare simplexml_load_string a $ xml

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

Oppure si può ancora utilizzare altri mezzi per aggiungere la codifica per l'output.

semplice sostituzione

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

espressioni regolari

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

DOMDocument-So che hai detto che non vuoi utilizzare DOMDocument, ma qui è un esempio

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

Puoi avvolgere questo codice in una funzione che riceve un parametro $ codifica e lo aggiunge al

4

semplice e chiaro solo fare questo

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

OutPut

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

a aggiungi attributi nell'elemento usa solo

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

per aggiungere l'uso bambino

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

La proposta DOMDoc di Cristian Toma sembra un buon approccio se il documento non è troppo pesante. Si potrebbe avvolgere in qualcosa di simile:

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

viene in aiuto quando non si ha accesso al serializzatore produrre il codice XML.

Problemi correlati