Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止php simplexml中的自动关闭标记_Php_Xml_Simplexml - Fatal编程技术网

如何防止php simplexml中的自动关闭标记

如何防止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

我想使用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());
$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>