如何防止php simplexml中的自动关闭标记
我想使用php simplexml生成xml如何防止php simplexml中的自动关闭标记,php,xml,simplexml,Php,Xml,Simplexml,我想使用php simplexml生成xml $xml = new SimpleXMLElement('<xml/>'); $output = $xml->addChild('child1'); $output->addChild('child2', "value"); $output->addChild('noValue', ''); Header('Content-type: text/xml'); print($xml->asXML()); $xm
$xml = new SimpleXMLElement('<xml/>');
$output = $xml->addChild('child1');
$output->addChild('child2', "value");
$output->addChild('noValue', '');
Header('Content-type: text/xml');
print($xml->asXML());
$xml=新的SimpleXMLElement(“”);
$output=$xml->addChild('child1');
$output->addChild('child2',“value”);
$output->addChild('noValue','');
标题('Content-type:text/xml');
打印($xml->asXML());
输出是
<xml>
<child1>
<child2>value</child2>
<noValue/>
</child1>
</xml>
价值
我想要的是,如果标签没有值,它应该显示如下
<noValue></noValue>
我试过使用来自的
LIBXML\u NOEMPTYTAG
我尝试了
$xml=newsimplexmlement(“”,LIBXML\u NOEMPTYTAG)代码>但它不起作用。因此,我不知道将LIBXML\u NOEMPTYTAG
放在哪里,因为简单的XML很麻烦,也许XMLWriter可以做您想做的事情
这里有一个
openMemory();
$oXMLWriter->startDocument('1.0','UTF-8');
$oXMLWriter->startElement('xml');
$oXMLWriter->writeElement('child1','HelloWorld!!');
$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>
你好,世界!!
LIBXML\u 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=新的SimpleXMLElement(“”);
$child1=$xml->addChild('child1');
$child1->addChild('child2',“value”);
$child1->addChild('noValue','');
$dom_sxe=dom_import_simplexml($xml);//返回一个DomeElement对象
$dom_output=新的DOMDocument('1.0');
$dom_output->formatOutput=true;
$dom_sxe=$dom_output->importNode($dom_sxe,true);
$dom_sxe=$dom_output->appendChild($dom_sxe);
echo$dom\u output->saveXML($dom\u output,LIBXML\u NOEMPTYTAG);
返回:
<?xml version="1.0" encoding="UTF-8"?>
<xml>
<child1>
<child2>value</child2>
<noValue></noValue>
</child1>
</xml>
价值
值得一提的是。。。NOEMPTYTAG选项可用于DOMDocument而不是simplexml的可能原因是空元素不被认为是有效的XML,而DOM规范允许它们。您的头撞在墙上,以获取无效的XML,这可能意味着有效的自动关闭空元素也可以工作。从我的评论扩展而来(有些已被删除):
行为取决于您的环境。同样的代码:
$xml = new SimpleXMLElement('<xml/>', LIBXML_NOEMPTYTAG);
$output = $xml->addChild('child1');
$output->addChild('child2', "value");
$output->addChild('noValue', '');
echo $xml->asXML();
编辑:
以上所有在线演示站点默认使用内容类型:text/plain
。如果要将XML作为独立资源直接输出到浏览器,可以在输出前指定标题:
header("Content-Type: text/xml");
echo $dom->saveXML($dom,LIBXML_NOEMPTYTAG);
尽管已经给出了相当长的答案——这些答案并不是特别错误,并且确实为一些libxml库内部以及它的PHP绑定提供了一些启示——但您很可能正在寻找:
$output->noValue = '';
要添加一个打开的标记、空节点值和结束标记(美化,演示在这里:):
价值
只需注意,现有答案似乎忽略了这一点。我必须获得子节点,并向nodeValue属性指定一个空字符串,然后会出现xml close标记
$output->childNodes[1]->nodeValue=''代码>
您好。嗯,它没有告诉您在链接到的页面中放置它的位置吗?是的,我尝试了$xml=new simplexmlement(“”,LIBXML\u NOEMPTYTAG)代码>但输出仍然相同。。编辑:嗯,这似乎与你的PHP设置有关。在3v4l和Ideone上,我仍然得到了自动关闭标记,而在本地主机php5.4上,我得到了预期的结果。LIBXML\u NOEMPTYTAG
仅适用于DOMDocument
,这意味着您需要使用dom\u import\u simplexml
将simplexml对象与该选项一起使用。请参阅我的答案。当内容类型显式设置为text/xml
时,当遇到空元素时,严格的xml解析器将抛出错误。此元素必须为空且不能自动关闭的任何原因?只是好奇这是否是由一个普通的api或库强加的(最终应该会被修复),谢谢Mike,它可以工作。但我想将其显示为xml页面。我尝试添加标题('Content-type:text/xml')代码>在echo
之前,第1列第1行出现错误:文档为空
。如何将其显示为xml页面?我添加了htmlentities(),以便输出完全显示在页面上。添加标题并将最后一行更改为echo$oXMLWriter->outputMemory(TRUE)代码>(psst,不确定您是否标记要迁移,但我认为)@MikeW:Aaah,确实如此@Wakanina-不确定我是如何发布两次答案的,但这是我更新的,以纠正初始答案中的DomeElement
错误。安东尼、迈克和路人:好吧,伙计们,你们的答案是正确的,但我更喜欢使用安东尼的方法,因为我很容易在我的应用程序中实现它。我只需要将我的simplexml对象转换为DOMDocument对象,所以我不会从头开始重建它。谢谢大家:)@Anthony:“空元素不被认为是有效的XML”-是这样吗?你能给我一些关于这一点的建议吗,我想了解更多关于这一点。“有效”可能不是正确的术语。我认为首选的术语应该是“格式良好”,这有点像鸡/蛋的场景,其中空元素可以表示为
,但当表示为
时格式良好,同时任何空元素都应该声明为空,这将表明元素不能选择性地为空,因此,如果数据
有效,
将不为空,因为第二个元素将表明元素声明为空
,这将使第一个元素无效。是规范中解决空元素概念的部分,尽管我找不到任何地方说明何时允许使用
(即非空元素可能为空)I di
header("Content-Type: text/xml");
echo $dom->saveXML($dom,LIBXML_NOEMPTYTAG);
$output->noValue = '';
<?xml version="1.0"?>
<xml>
<child1>
<child2>value</child2>
<noValue></noValue>
</child1>
</xml>