4

我正在使用 PHP 的 SimpleXML 扩展构建一个 XML 文档,并且我正在向文件中添加一个令牌:

$doc->addChild('myToken');

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

<myToken/>

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

<myToken></myToken>

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

4

5 回答 5

4

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

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

// some processing here

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

试试看它是否有效。否则,恐怕是 preg_replace-land。

于 2008-11-03T20:06:43.500 回答
3

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

于 2015-04-11T17:43:51.400 回答
2

目前,无法避免使用 LibXML 的自闭合标签。@Piskvor 提出的解决方案之一将不起作用:

LIBXML_NOEMPTYTAG不适用于 simplexml,如下所述:

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

一个解决方法是使用这个问题的答案

于 2014-07-30T12:07:41.660 回答
0

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

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

$data = preg_replace('/\<(\w+)\s*\/\s*\>/i', '<$1></$1>', $xml_reader->readOuterXML());
于 2015-06-24T13:46:44.563 回答
0

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

$dom = dom_import_simplexml(SimpleXMLElement)->ownerDocument;
$dom->formatOutput = true;
$dom->save($save_path, LIBXML_NOEMPTYTAG);
于 2019-05-29T08:50:04.280 回答