環境準備(Windows PHP 4.3.4 + MySQL 4.0.16)
- 安裝 PHP Installer。
- 解壓
iconv.dll 至 C:\Windows\System32。
- 建立
C:\PHP\extensions,放入 php_domxml.dll。
- 編輯
php.ini:
extension_dir = "C:\PHP\extensions"
extension=php_domxml.dll(移除分號)。
- 重啟 IIS / Apache。
CMySQLXML 類別原始碼
class CMySQLXML {
var $host, $user, $password, $db;
function CMySQLXML($host, $user, $password, $db) {
$this->host = $host;
$this->user = $user;
$this->password = $password;
$this->db = $db;
}
function run_sql_return_XML($sql_string) {
$conn = mysql_connect($this->host, $this->user, $this->password);
mysql_select_db($this->db, $conn);
$result = mysql_query($sql_string, $conn);
$doc = domxml_open_mem("<root/>"); // 建立空文件
$root = $doc->document_element();
while ($row = mysql_fetch_assoc($result)) {
$table_name = mysql_field_table($result, 0);
$row_elem = $doc->create_element($table_name);
$row_elem = $root->append_child($row_elem);
$num_fields = mysql_num_fields($result);
for ($i = 0; $i < $num_fields; $i++) {
$field_name = mysql_field_name($result, $i);
$col_elem = $doc->create_element($field_name);
$col_elem = $row_elem->append_child($col_elem);
$text = $doc->create_text_node($row[$field_name]);
$col_elem->append_child($text);
}
}
mysql_free_result($result);
mysql_close($conn);
return $doc->dump_mem(false); // 回傳 XML 字串
}
}
使用範例
$xml = new CMySQLXML('localhost', 'user', 'pass', 'test');
header('Content-Type: text/xml; charset=utf-8');
echo $xml->run_sql_return_XML('SELECT * FROM users');
關鍵點解析
domxml_open_mem 建立記憶體 DOM 文件,根節點自訂(此處 <root/>)。
- 逐列建立
<table_name> 節點,欄位對應子節點,值存文字節點。
- 回傳
dump_mem(false) 為不格式化 XML 字串;true 會縮排。
- PHP 5+ 建議改用
DOMDocument + mysqli/PDO,domxml 已棄用。
現代化重寫建議(PHP 7/8)
class MySQLToXML {
private PDO $pdo;
public function __construct(string $dsn, string $user, string $pass) {
$this->pdo = new PDO($dsn, $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
}
public function queryToXML(string $sql): string {
$stmt = $this->pdo->query($sql);
$dom = new DOMDocument('1.0', 'UTF-8');
$root = $dom->createElement('resultset');
$dom->appendChild($root);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$rowElem = $dom->createElement('row');
$root->appendChild($rowElem);
foreach ($row as $col => $val) {
$colElem = $dom->createElement($col);
$colElem->appendChild($dom->createTextNode((string)$val));
$rowElem->appendChild($colElem);
}
}
return $dom->saveXML();
}
}