Отключить самозакрывающиеся теги в SimpleXML для PHP? - PullRequest
3 голосов
/ 03 ноября 2008

Я создаю XML-документ с расширением PHP SimpleXML и добавляю токен в файл:

$doc->addChild('myToken');

Это генерирует (что я знаю как) самозакрывающийся или одиночный тег:

<myToken/>

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

<myToken></myToken>

Вопрос в том, как мне это сделать, за исключением запуска сгенерированного XML через preg_replace ?

Ответы [ 5 ]

4 голосов
/ 03 ноября 2008

Из документации на SimpleXMLElement -> __ construct и Предопределенные константы LibXML , думаю, это должно работать:

<?php
$sxe = new SimpleXMLElement($someData, LIBXML_NOEMPTYTAG);

// some processing here

$out = $sxe->asXML();
?>

Попробуйте и посмотрите, работает ли это. В противном случае, боюсь, это preg_replace-land.

1 голос
/ 11 апреля 2015

Если вы установите значение на что-то пустое (т. Е. Null, пустая строка), оно будет использовать скобки открытия / закрытия.

$tag = '<SomeTagName/>';

echo "Tag: '$tag'\n\n";

$x = new SimpleXMLElement($tag);
echo "Autoclosed: {$x->asXML()}\n";

$x = new SimpleXMLElement($tag);
$x[0] = null;
echo "Null: {$x->asXML()}\n";

$x = new SimpleXMLElement($tag);
$x[0] = '';
echo "Empty: {$x->asXML()}\n";

См. Пример: http://sandbox.onlinephpfunctions.com/code/10642a84dca5a50eba882a347f152fc480bc47b5

1 голос
/ 30 июля 2014

В настоящее время невозможно избежать самозакрывающихся тегов с помощью LibXML. Одно из предложенных решений @Piskvor не подойдет:

LIBXML_NOEMPTYTAG не работает с simplexml, как упоминалось здесь :

This option is currently just available in the DOMDocument::save and DOMDocument::saveXML functions.

Обходным путем для этого будет использование ответа от на этот вопрос

0 голосов
/ 29 мая 2019

LIBXML_NOEMPTYTAG работает, но только если вы используете DOMDocument::save или DOMDocument::saveXML

$dom = dom_import_simplexml(SimpleXMLElement)->ownerDocument;
$dom->formatOutput = true;
$dom->save($save_path, LIBXML_NOEMPTYTAG);
0 голосов
/ 24 июня 2015

Может быть не лучшим решением, но получил ту же проблему и решил ее с помощью pre_replace, чтобы изменить все самозакрывающиеся теги на полную форму ...

$xml_reader = new XMLReader;
$xml_reader->open($xml_file);

$data = preg_replace('/\<(\w+)\s*\/\s*\>/i', '<$1></$1>', $xml_reader->readOuterXML());
...