以下是一些程式碼,它接受一個關聯陣列並將其列印為 XML(),但會為每個字串建立 CDATA 區段
<?php
類別 SimpleXMLExtended 繼承 SimpleXMLElement{
公開函式 addCData($string){
$dom = dom_import_simplexml($this);
$cdata = $dom->ownerDocument->createCDATASection($string);
$dom->appendChild($cdata);
}
}
函式 assocArrayToXML($root_element_name,$ar){
$xml = new SimpleXMLExtended("<?xml version=\"1.0\"?><{$root_element_name}></{$root_element_name}>");
$f = create_function('$f,$c,$a','
foreach($a as $k=>$v) {
if(is_array($v)) {
if (!is_numeric($k))$ch=$c->addChild($k);
else $ch = $c->addChild(substr($c->getName(),0,-1));
$f($f,$ch,$v);
} else {
if (is_numeric($v)){ $c->addChild($k, $v);
}else{$n = $c->addChild($k); $n->addCData($v);}
}
}');
$f($f,$xml,$ar);
return $xml->asXML();
}
$result = array("title"=>"CDATA 範例");
$result['items'] = array();
$result['items'][] = array('title'=>'一些字串', 'number' => 1);
$result['items'][] = array('title'=>'一些字串', 'number' => 2);
$result['items'][] = array('title'=>'一些字串', 'number' => 3);
echo assocArrayToXML('result',$result);
?>
可以用更精細的正規表達式來取代 is_numeric 檢查,以確認字串是否真的不安全,但这對我來說已經夠用了。