在SimpleXML for PHP中关闭自动关闭标签?

时间:2008-11-03 19:53:34

标签: php xml simplexml

我正在使用PHP的SimpleXML扩展构建一个XML文档,我正在为该文件添加一个标记:

$doc->addChild('myToken');

这会生成(我所知道的)自动关闭或单个标签:

<myToken/>

但是,我正在与之通信的老化网络服务正在绊倒所有自动关闭标签,所以我需要一个单独的开始和结束标签:

<myToken></myToken>

问题是,除了通过 preg_replace 运行生成的XML之外,我该怎么做?

5 个答案:

答案 0 :(得分:4)

SimpleXMLElement->__constructLibXML Predefined Constants的文档中,我认为这应该有效:

<?php
$sxe = new SimpleXMLElement($someData, LIBXML_NOEMPTYTAG);

// some processing here

$out = $sxe->asXML();
?>

试一下,看看它是否有效。否则,我担心,这是preg_replace-land。

答案 1 :(得分:1)

目前,用LibXML无法避免自动关闭标签。 @Piskvor建议的解决方案之一将不起作用:

LIBXML_NOEMPTYTAG不适用于simplexml,如提及的here

This option is currently just available in the DOMDocument::save and DOMDocument::saveXML functions.

解决方法是使用this question

的答案

答案 2 :(得分:1)

如果将值设置为空(即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

答案 3 :(得分:0)

可能不是最好的解决方案但是遇到了同样的问题并使用pre_replace将所有自闭标签更改为完整形式来解决它...

$xml_reader = new XMLReader;
$xml_reader->open($xml_file);

$data = preg_replace('/\<(\w+)\s*\/\s*\>/i', '<$1></$1>', $xml_reader->readOuterXML());

答案 4 :(得分:0)

LIBXML_NOEMPTYTAG有效,但前提是您使用DOMDocument::saveDOMDocument::saveXML

$dom = dom_import_simplexml(SimpleXMLElement)->ownerDocument;
$dom->formatOutput = true;
$dom->save($save_path, LIBXML_NOEMPTYTAG);