如何防止php simplexml中的自闭标签

时间:2013-10-28 07:41:14

标签: 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());

输出

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

我想要的是如果标签没有值,它应该像这样显示

<noValue></noValue>

我尝试使用Turn OFF self-closing tags in SimpleXML for PHP?

中的LIBXML_NOEMPTYTAG

我已经尝试了$xml = new SimpleXMLElement('<xml/>', LIBXML_NOEMPTYTAG);但它不起作用。所以我不知道在哪里放LIBXML_NOEMPTYTAG

5 个答案:

答案 0 :(得分:21)

根据{{​​3}}:

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,这可能表明有效的自闭合空元素也可以正常工作。

答案 1 :(得分:6)

尽管已经给出了相当冗长的答案 - 这并没有特别的错误,并且为一些libxml库内部提供了一些亮点,并且它是PHP绑定 - 你最有可能寻找:

$output->noValue = '';

要添加一个开放标记,空节点值和结束标记(美化,演示在这里:http://3v4l.org/S2PKc):

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

注意到现在的答案似乎忽略了它。

答案 2 :(得分:1)

由于Simple XML被证明是麻烦的,也许XMLWriter可以做你想要的。

这是fiddle

<?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>

答案 3 :(得分:0)

延伸我的评论(有些已被删除):

行为取决于您的环境。同样的代码:

$xml = new SimpleXMLElement('<xml/>', LIBXML_NOEMPTYTAG);

$output = $xml->addChild('child1');
$output->addChild('child2', "value");
$output->addChild('noValue', '');

echo $xml->asXML();

3v4l.orgIdeone.com中,它会产生自动关闭标记;
eval.incodepad.org和我的localhost(PHP 5.3 / 5.4,libXML 2.7,Windows)中,它会生成空标记。

根据PHP document LIBXML_NOEMPTYTAG 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); 仅在DOM中工作,您可能需要尝试Content-Type: text/plain来保证:

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

3v4l.org demo

修改

以上所有在线演示网站默认使用{{1}}。如果要将XML作为独立资源直接输出到浏览器,可以在输出前指定标题:

{{1}}

答案 4 :(得分:0)

我必须获取子节点并将一个空字符串分配给nodeValue属性,然后出现xml close标签。

const nodes = Array.from(document.querySelector('div').childNodes); const text = nodes.map(t => t.nodeType == Node.TEXT_NODE ? t.textContent : '' ); console.log(text.join(''));

问候。