使用Simple XML Serialization库如何禁用XML自闭合标签?
解决SimpleXML生成自闭合标签的问题
嘿,我刚好碰到过一模一样的情况!SimpleXML默认确实会把空元素输出成自闭合标签,要改成你想要的<Hlavicka></Hlavicka>完整格式,咱们得借DOMDocument的力来实现——毕竟SimpleXML本身没直接的配置项能改这个行为。
这里给你一个靠谱的实现方案,附代码示例:
- 先正常用SimpleXML创建元素和属性
- 把SimpleXML对象转换成DOM节点,利用DOMDocument更强的输出控制能力
- 给所有空元素添加一个空白文本节点,让DOM把它识别为“有内容”的元素,从而输出完整闭合标签
具体代码如下:
// 初始化SimpleXML根节点 $xml = new SimpleXMLElement('<root></root>'); // 添加你的Hlavicka元素及属性 $hlavicka = $xml->addChild('Hlavicka'); $hlavicka->addAttribute('dat_odesl', '2019-05-30T17:08:28+02:00'); $hlavicka->addAttribute('uuid_zpravy', 'ffd8ea09-3ecc-47b8-8203-0b1894f9c249'); // 转换为DOMDocument进行处理 $dom = new DOMDocument('1.0', 'UTF-8'); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; // 可选,让输出的XML排版更美观 // 把SimpleXML节点导入到DOM环境中 $domNode = dom_import_simplexml($xml); $domNode = $dom->importNode($domNode, true); $dom->appendChild($domNode); // 关键操作:给所有空元素添加空白文本节点 $xpath = new DOMXPath($dom); $emptyElements = $xpath->query('//*[not(node())]'); foreach ($emptyElements as $element) { $element->appendChild($dom->createTextNode('')); } // 输出最终的XML echo $dom->saveXML();
运行这段代码后,你就能得到带有完整闭合标签的XML啦!
为什么要这么做?因为DOMDocument判断元素是否为空的依据是有没有子节点(包括文本节点),哪怕是一个空白的文本节点,它也会认为元素有内容,从而输出完整的开始和结束标签,而不是自闭合形式。
另外提醒一句,别直接用字符串替换的方式修改自闭合标签——万一XML里有类似格式的文本内容,很容易误改,用DOM的方法才是安全可靠的正道。
内容的提问来源于stack exchange,提问作者Pepa Zapletal
相关产品推荐
相关产品推荐

