Подтвердить что ты не робот

Удалить тег версии 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 node? Спасибо вам

4b9b3361

Ответ 1

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

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

Ответ 2

У меня есть близкое решение принятого ответа:

Если у вас 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

Ответ 3

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

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

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

Ответ 4

Попробуйте:

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

Ответ 5

Там другой путь без замены 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>

Ответ 6

Поскольку 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>

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

Теги заголовка XML и короткие теги PHP несовместимы. Таким образом, это может быть проблемой использования коротких тегов в PHP (т.е. <?= вместо <?php echo...). Таким образом, выключение коротких тегов в PHP.INI(и обновление вашего кода соответственно) может решить эту проблему.