Я хочу создать 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);