我想使用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
答案 0 :(得分:21)
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.org和Ideone.com中,它会产生自动关闭标记;
在eval.in,codepad.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);
修改强>:
以上所有在线演示网站默认使用{{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(''));
问候。