我建設與PHP的SimpleXML擴展的XML文檔,我加入一個令牌文件:在SimpleXML for PHP中關閉自閉標籤?
$doc->addChild('myToken');
這會產生(我是知道的)一個自閉或單個標籤:
<myToken/>
不過,我有被絆倒各地自閉標籤通信老化Web服務,所以我需要有一個單獨的打開和關閉標籤:
<myToken></myToken>
現在的問題是,除了通過preg_replace運行生成的XML之外,我該如何做到這一點?
我建設與PHP的SimpleXML擴展的XML文檔,我加入一個令牌文件:在SimpleXML for PHP中關閉自閉標籤?
$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。
目前,無法避免使用LibXML自我關閉標籤。一個由@Piskvor所提出的解決方案是行不通的:
LIBXML_NOEMPTYTAG不simplexml的工作,作爲mentionned here:
This option is currently just available in the DOMDocument::save and DOMDocument::saveXML functions.
一種解決方法是將要使用的答案從this question
這似乎是對現有答案的迴應,而不是問題的答案,所以應在該答案下添加爲註釋。 – IMSoP 2014-07-30 12:10:32
如果您將值設置爲空(即空,空字符串),它將使用打開/關閉括號。
$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
可能不是最好的解決辦法,但得到了同樣的問題,用pre_replace全部自行閉合的標籤更改爲完整的形式解決它......
$xml_reader = new XMLReader;
$xml_reader->open($xml_file);
$data = preg_replace('/\<(\w+)\s*\/\s*\>/i', '<$1></$1>', $xml_reader->readOuterXML());
或者只是手工編碼。 – 2008-11-03 20:07:37