开发者

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">&开发者_开发百科lt;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.


As SimpleXMLElement always uses "\n" to separate the XML-Declaration from the rest of the document, it can be split at that position and the remainder taken:

explode("\n", $customXML->asXML(), 2)[1];

Example:

<?php

$customXML = new SimpleXMLElement('<!-- some comment -->
<abc>
</abc>');

echo explode("\n", $customXML->asXML(), 2)[1];

Output:

<!-- some comment -->
<abc>
</abc>


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>


Try:

$xmlString = $doc->saveXML();
$xmlString = str_replace("<?xml version=\"1.0\"?>\n", '', $xmlString);
file_put_contents($filename, $xmlString);


echo preg_replace("/<\\?xml.*\\?>/",'',$doc->saveXML(),1);


If this is a problem, this should do it:

$xml = str_replace(' version="1.0"', '', $xml);`


$customXML = new SimpleXMLElement('<source><abc>hello</abc></source>');
$result = $customXML->xpath('//abc');
$result = $result[0];
var_dump($result->asXML());


XML header tags and PHP short tags are incompatible. So, this may be an issue of using the short tags in PHP (i.e. <?= instead of <?php echo...). So, turning off short tags in PHP.INI (and updating your code appropriately) may resolve this issue.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜