php解析xml主要有以下几种方式:Xml parser, SimpleXML, XMLReader, DOMDocument。
我主要使用了SimpleXML来进行解析
//获取属性
function get_attrs($xml)
{
$attrs = array();
foreach ($xml->attributes() as $key => $val) {
$key = strval($key);
$val = strval($val);
$attrs[$key] = $val;
}
return $attrs;
}
//检重
function xml_to_assoc_array($tag_name, $key_name, $filename, $required_fields = array())
{
$arr = array();
$fname=CONF_PATH .$filename;
if(!file_exists($fname)){
return true;
}
$xml = safe_open_xml_file($fname);
if ($xml === false)
{
return $arr;
}
foreach ($xml->xpath("//".$tag_name) as $name => $child) {
$attrs = get_attrs($child);
$key = $attrs[$key_name];
# if (empty($key)) {
# continue;
# }
if (!empty($key) && array_key_exists($key, $arr)) {
blame_and_die("解析文件{$filename}时, 发现字段 {$key_name} = {$key} 重复了\r\n");
}
$attrs['_xml_'] = $child;
if (!empty($key_name)) {
$arr[$key] = $attrs;
} else {
$arr[] = $attrs;
}
}
return true;
}
//打开文件
function safe_open_xml_file($filename)
{
if (!file_exists($filename)) {
blame_and_die("文件{$filename}不存在!");
}
$xml = simplexml_load_file($filename);
if ($xml === false) {
echo "解析{$filename}有误!请检查xml格式!错误信息如下:\r\n";
foreach (libxml_get_errors() as $error) {
echo "\t", $error->message;
}
}
return $xml;
}