我正在使用 PHP 的 SimpleXML 扩展构建一个 XML 文档,并且我正在向文件中添加一个令牌:
$doc->addChild('myToken');
这会生成(我所知道的)一个自关闭或单个标签:
<myToken/>
但是,我正在与之通信的老化的 Web 服务正在绊倒自闭标签,所以我需要有一个单独的开始和结束标签:
<myToken></myToken>
问题是,除了通过preg_replace运行生成的 XML 之外,我该怎么做?
从SimpleXMLElement->__construct和LibXML Predefined Constants的文档中,我认为这应该有效:
<?php
$sxe = new SimpleXMLElement($someData, LIBXML_NOEMPTYTAG);
// some processing here
$out = $sxe->asXML();
?>
试试看它是否有效。否则,恐怕是 preg_replace-land。
如果您将值设置为空值(即 null、空字符串),它将使用开/关括号。
$tag = '<SomeTagName/>';
echo "Tag: '$tag'\n\n";
$x = new SimpleXMLElement($tag);
echo "Autoclosed: {$x->asXML()}\n";
$x = new SimpleXMLElement($tag);
$x[0] = null;
echo "Null: {$x->asXML()}\n";
$x = new SimpleXMLElement($tag);
$x[0] = '';
echo "Empty: {$x->asXML()}\n";
参见示例:http ://sandbox.onlinephpfunctions.com/code/10642a84dca5a50eba882a347f152fc480bc47b5
目前,无法避免使用 LibXML 的自闭合标签。@Piskvor 提出的解决方案之一将不起作用:
LIBXML_NOEMPTYTAG不适用于 simplexml,如下所述:
This option is currently just available in the DOMDocument::save and DOMDocument::saveXML functions.
一个解决方法是使用这个问题的答案
可能不是最好的解决方案,但遇到了同样的问题,并通过使用 pre_replace 将所有自闭合标签更改为完整形式来解决它......
$xml_reader = new XMLReader;
$xml_reader->open($xml_file);
$data = preg_replace('/\<(\w+)\s*\/\s*\>/i', '<$1></$1>', $xml_reader->readOuterXML());
LIBXML_NOEMPTYTAG
有效,但前提是您使用DOMDocument::save
或DOMDocument::saveXML
$dom = dom_import_simplexml(SimpleXMLElement)->ownerDocument;
$dom->formatOutput = true;
$dom->save($save_path, LIBXML_NOEMPTYTAG);