在 PHP 開發中,處理 XML 資料是常見需求。本文提供一個實用的 XMLParser 類別,能夠將 XML 檔案或字串轉換為 PHP 陣列,方便後續資料操作。
<?php
/** XML 檔案解析類
* Date: 2013-02-01
* Author: fdipzone
* Ver: 1.0
*/
class XMLParser {
/** 讀取 XML 檔案
* @param String $xmlfile 檔案路徑
* @return Array [成功標誌, 資料陣列]
*/
public function loadXmlFile($xmlfile) {
$xmlstring = file_exists($xmlfile) ? file_get_contents($xmlfile) : '';
list($flag, $data) = $this->parser($xmlstring);
return $this->response($flag, $data);
}
/** 讀取 XML 字串
* @param String $xmlstring XML 內容
* @return Array [成功標誌, 資料陣列]
*/
public function loadXmlString($xmlstring) {
list($flag, $data) = $this->parser($xmlstring);
return $this->response($flag, $data);
}
/** 解析 XML 內容(私有方法) */
private function parser($xmlstring) {
$flag = false;
$data = array();
if ($this->checkXmlFormat($xmlstring)) {
$flag = true;
$data = simplexml_load_string($xmlstring, 'SimpleXMLElement', LIBXML_NOCDATA);
$this->objectToArray($data);
}
return array($flag, $data);
}
/** 檢查 XML 格式 */
private function checkXmlFormat($xmlstring) {
if ($xmlstring === '') return false;
$xml_parser_obj = xml_parser_create();
return xml_parse_into_struct($xml_parser_obj, $xmlstring, $vals, $indexs) === 1;
}
/** 物件轉陣列(遞迴處理) */
private function objectToArray(&$object) {
$object = (array)$object;
foreach ($object as $key => $value) {
if ($value === '') {
$object[$key] = "";
} elseif (is_object($value) || is_array($value)) {
$this->objectToArray($value);
$object[$key] = $value;
}
}
}
/** 統一回應格式 */
private function response($flag = false, $data = array()) {
return array($flag, $data);
}
}
?>
<?php
require "XMLParser.class.php";
$xmlfile = 'file.xml';
$xmlstring = '<?xml version="1.0" encoding="utf-8"?>
<xmlroot>
<status>1000</status>
<info></info>
<result>
<id>100</id>
<name>fdipzone</name>
<gender>1</gender>
<age>28</age>
</result>
</xmlroot>';
echo '<pre>';
$xml_parser = new XMLParser();
echo "解析 XML 檔案\r\n";
list($flag, $xmldata) = $xml_parser->loadXmlFile($xmlfile);
if ($flag) print_r($xmldata);
echo "解析 XML 字串\r\n";
list($flag, $xmldata) = $xml_parser->loadXmlString($xmlstring);
if ($flag) print_r($xmldata);
echo '</pre>';
?>
PHP 的 XML 相關預定義常數可參考官方文件。此外,文中也提供了使用 DOMDocument 產生 XML 檔案的範例,以及 ASP 讀取 XML 的參考代碼,供不同需求的開發者參考。