Я создаю xml, используя это
$customXML = new SimpleXMLElement('<abc></abc>');
после добавления некоторых атрибутов к этому, когда я пытаюсь распечатать его, он выглядит следующим образом:
<?xml version="1.0"?> <abc id="332"><params><param name="aa">33</param></params></abc>
Есть ли способ удалить узел версии xml? спасибо
Теоретически вы можете предоставить параметр 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 (и соответствующее обновление вашего кода) может решить эту проблему.