程式狂想筆記

一個攻城師奮鬥史

0%

CodeIgniter 輸出XML 筆記

最近收到要實作要回傳 XML 的 API
不過,真得已經習慣用 PHP 做 JSON 格式
只需要用 json_encode 就可以搞定

PHP 本身函式就有對 XML 做解析
不過組 XML 好像沒有比較好方式

有查到php - XML creation using CodeIgniter - Stack Overflow

Database Utility Class — CodeIgniter 3.1.9 documentation

但這次 DB 剛好存的資料不是剛好要組出來的資料
最終有網路看到原生支援的方法
加上補<![CDATA[ ]]!>
這一段是防止>符號產生錯誤
也不用改寫成&lt;

XML CDATA

SimpleXMLElement 加上 CDATA 方法

php 使用 simpleXML 添加 CDATA 格式数据

php – 如何使用 SimpleXmlElement 编写 CDATA? - 代码日志

PHP: DOMDocument::createCDATASection - Manual

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
/**
* to show <title lang="en"><![CDATA[Site Title]]></title> instead of <title lang="en">Site Title</title>
*
*/
class SimpleXMLExtended extends SimpleXMLElement
{
public function addCData($cdata_text)
{
$node = dom_import_simplexml($this);
$no = $node->ownerDocument;
$node->appendChild($no->createCDATASection($cdata_text));
}
}
$xmlFile = 'config.xml';
// instead of $xml = new SimpleXMLElement('<sites/>');
$xml = new SimpleXMLExtended('<sites/>');
$site = $xml->addChild('site');
// instead of $site->addChild('site', 'Site Title');
$site->title = NULL; // VERY IMPORTANT! We need a node where to append
$site->title->addCData('Site Title');
$site->title->addAttribute('lang', 'en');
$xml->asXML($xmlFile);
?>

然後用 PHP 內建多行字串,需要注意用 NOWODC
使用 HEREDOC,裡面有$會抓取 PHP 變數
所以需要用 NOWDOC

出輸內容

Output Class — CodeIgniter 3.1.5 documentation

1
2
3
4
5
6
7
$this->output
->set_content_type('application/json')
->set_output(json_encode(array('foo' => 'bar')));

$this->output
->set_content_type('jpeg') // You could also use ".jpeg" which will have the full stop removed before looking in config/mimes.php
->set_output(file_get_contents('files/something.jpg'));

結果

研究完,收到要改寫回傳 JSON 的 api
不過 json 會更簡單
json(xxxx,true)

1
2
3
4
5
$json = [
"test"=>[
"number=>[0,1,2,3,4,5]
]
]

寫法有空整理再發文

2019-01-02 補充 Array to XML 的 Library
GitHub - Jeckerson/array2xml: [PHP] - Array to XML

GitHub - spatie/array-to-xml: A simple class to convert an array to xml

2019-03-12 用原生方法沒辦法載入
[xml - How to get values inside <CDATA[values]] > using php DOM? - Stack Overflow
[xml - PHP: How to handle <![CDATA with SimpleXMLElement? - Stack Overflow

1
2
3
4
5
$content = simplexml_load_string(
'<content><![CDATA[Hello, world!]]></content>'
, null
, LIBXML_NOCDATA
);

PHP 操作 XML | 程式前沿