удалить тег версии xml, когда xml создается в php

Я создаю xml, используя это

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

после добавления некоторых атрибутов к этому, когда я пытаюсь распечатать его, он выглядит следующим образом:

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

Есть ли способ удалить узел версии xml? спасибо

Solutions Collecting From Web of "удалить тег версии xml, когда xml создается в php"

Теоретически вы можете предоставить параметр LIBXML_NOXMLDECL для удаления объявления XML при сохранении документа, но это доступно только в Libxml> = 2.6.21 (и багги ). Альтернативой будет использование

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

Я согласен с принятым ответом:

Если у вас xml allready загружен в переменную:

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

Для файла XML с диска:

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

Этот комментарий помог: http://www.php.net/manual/en/domdocument.savexml.php#88525

Практическое решение: вы знаете, что первое вхождение ?> В результирующей строке будет потом концом подстроки версии xml. Так:

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

Обратите внимание, что ?> Делится на две части, потому что в противном случае у некоторых слабых синтаксических маркеров могут возникать проблемы с синтаксическим анализом в этой точке.

Пытаться:

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

Есть другой способ без замены xml-заголовка. Я предпочитаю это:

 $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); 

Дает выход:

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

Поскольку SimpleXMLElement всегда использует "\n" чтобы отделить XML-декларацию от остальной части документа, ее можно разбить на эту позицию, а оставшаяся часть:

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

Пример:

 <?php $customXML = new SimpleXMLElement('<!-- some comment --> <abc> </abc>'); echo explode("\n", $customXML->asXML(), 2)[1]; 

Вывод:

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

Если это проблема, это должно сделать это:

 $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 и короткие теги PHP несовместимы. Таким образом, это может быть проблема использования коротких тегов в PHP (т. Е. <?= Вместо <?php echo... ). Таким образом, выключение коротких тегов в PHP.INI (и соответствующее обновление вашего кода) может решить эту проблему.