Как предотвратить закрытие тега в php simplexml

Я хочу создать xml, используя php simplexml.

$xml = new SimpleXMLElement('<xml/>'); $output = $xml->addChild('child1'); $output->addChild('child2', "value"); $output->addChild('noValue', ''); Header('Content-type: text/xml'); print($xml->asXML()); 

Выход

 <xml> <child1> <child2>value</child2> <noValue/> </child1> </xml> 

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

 <noValue></noValue> 

Я пробовал использовать LIBXML_NOEMPTYTAG из самозакрывающихся тегов Turn OFF в SimpleXML для PHP?

Я пробовал $xml = new SimpleXMLElement('<xml/>', LIBXML_NOEMPTYTAG); и это не сработает. Поэтому я не знаю, куда положить LIBXML_NOEMPTYTAG

LIBXML_NOEMPTYTAG не работает с simplexml, по спецификации :

Этот параметр в настоящее время доступен только в функциях DOMDocument :: save и DOMDocument :: saveXML.

Чтобы добиться того, что вам нужно, вам нужно преобразовать объект simplexml в объект DOMDocument:

 $xml = new SimpleXMLElement('<xml/>'); $child1 = $xml->addChild('child1'); $child1->addChild('child2', "value"); $child1->addChild('noValue', ''); $dom_sxe = dom_import_simplexml($xml); // Returns a DomElement object $dom_output = new DOMDocument('1.0'); $dom_output->formatOutput = true; $dom_sxe = $dom_output->importNode($dom_sxe, true); $dom_sxe = $dom_output->appendChild($dom_sxe); echo $dom_output->saveXML($dom_output, LIBXML_NOEMPTYTAG); 

который возвращает:

 <?xml version="1.0" encoding="UTF-8"?> <xml> <child1> <child2>value</child2> <noValue></noValue> </child1> </xml> 

Что-то стоит указать … вероятная причина, по которой опция NOEMPTYTAG доступна для DOMDocument, а не simplexml, состоит в том, что пустые элементы не считаются допустимыми XML, в то время как спецификация DOM позволяет им. Вы стучите головой о стену, чтобы получить недопустимый XML, что может предполагать, что действительный самозакрывающийся пустой элемент будет работать так же хорошо.

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

 $output->noValue = ''; 

Чтобы добавить открытый тег, пустое значение узла и конечный тег (украшено, демо здесь: http://3v4l.org/S2PKc ):

 <?xml version="1.0"?> <xml> <child1> <child2>value</child2> <noValue></noValue> </child1> </xml> 

Просто отметив, что, по-видимому, это было упущено с существующими ответами.

Поскольку Simple XML доказывает, что проблема, возможно, XMLWriter может делать то, что вы хотите.

Вот скрипка

 <?php $oXMLWriter = new XMLWriter; $oXMLWriter->openMemory(); $oXMLWriter->startDocument('1.0', 'UTF-8'); $oXMLWriter->startElement('xml'); $oXMLWriter->writeElement('child1', 'Hello world!!'); $oXMLWriter->writeElement('noValue', ''); $oXMLWriter->endElement(); $oXMLWriter->endDocument(); echo htmlentities($oXMLWriter->outputMemory(TRUE)); ?> 

Вывод:

 <?xml version="1.0" encoding="UTF-8"?> <xml> <child1>Hello world!!</child1> <noValue></noValue> </xml> 

Расширение от моих комментариев (некоторые из них были удалены):

Поведение зависит от вашей среды. Этот же код:

 $xml = new SimpleXMLElement('<xml/>', LIBXML_NOEMPTYTAG); $output = $xml->addChild('child1'); $output->addChild('child2', "value"); $output->addChild('noValue', ''); echo $xml->asXML(); 

В 3v4l.org и Ideone.com он создает самозакрывающийся тег;
В eval.in , codepad.org и на моем localhost (PHP 5.3 / 5.4, libXML 2.7, Windows) он создает пустой тег.

Поскольку в соответствии с документом PHP , LIBXML_NOEMPTYTAG только (guarenteed to) работает в DOM , вы можете попробовать DOM для обеспечения:

 $dom=new DOMDocument("1.0","UTF-8"); $dom->formatOutput=true; $root=$dom->createElement("xml"); $dom->appendChild($root); $child1=$dom->createElement("child1"); $root->appendChild($child1); $node=$dom->createElement("child2"); $node->appendChild($dom->createTextNode("value")); $child1->appendChild($node); $node=$dom->createElement("noValue"); $child1->appendChild($node); echo $dom->saveXML($dom,LIBXML_NOEMPTYTAG); 

Демо-версия 3v4l.org .

Изменить :

На всем вышеупомянутом онлайн-демо-сайте по умолчанию используется Content-Type: text/plain . Если вы хотите напрямую выводить XML в браузер в качестве автономного ресурса, вы можете указать заголовок перед выходом:

 header("Content-Type: text/xml"); echo $dom->saveXML($dom,LIBXML_NOEMPTYTAG);