remove xml version tag when a xml is created in php

I'm creating a xml using this

$customXML = new SimpleXMLElement('<abc></abc>');

after adding some attributes onto this, when I try to print it it appears like this,

<?xml version="1.0"?>
<abc id="332"><params><param name="aa">33</param></params></abc>

Is there a way to remove the xml version node ? Thank you


In theory you can provide the LIBXML_NOXMLDECL option to drop the XML declaration when saving a document, but this is only available in Libxml >= 2.6.21 (and buggy). An alternative would be to use

$customXML = new SimpleXMLElement('<abc></abc>');
$dom = dom_import_simplexml($customXML);
echo $dom->ownerDocument->saveXML($dom->ownerDocument->documentElement);

I have a simmilar solution to the accepted answer:

If you have xml allready loaded in a variable:

$t_xml = new DOMDocument();
$t_xml->loadXML($xml_as_string);
$xml_out = $t_xml->saveXML($t_xml->documentElement);

For XML file from disk:

$t_xml = new DOMDocument();
$t_xml->load($file_path_to_xml);
$xml_out = $t_xml->saveXML($t_xml->documentElement);

This comment helped: http://www.php.net/manual/en/domdocument.savexml.php#88525


A practical solution: you know that the first occurrence of ?> in the result string is going to be then end of the xml version substring. So:

$customXML = new SimpleXMLElement('<abc></abc>');
$customXML = substr($customXML, strpos($customXML, '?'.'>') + 2);

Note that ?> is split into two parts because otherwise some poor syntax highlighter may have problems parsing at this point.


There's another way without the replacing xml header. I prefer this:

$xml = new xmlWriter();
$xml->openMemory();
$xml->startElement('abc');
$xml->writeAttribute('id', 332);
$xml->startElement('params');
$xml->startElement('param');
$xml->writeAttribute('name', 'aa');
$xml->text('33');
$xml->endElement();
$xml->endElement();
echo $xml->outputMemory(true);

Gives output:

<abc id="332"><params><param name="aa">33</param></params></abc>