|
本文实例讲述了PHP封装的XML简单操作类。分享给大家供大家参考,具体如下:
xml_dom.php封装类文件:
dbfile = $db_file;
if(!file_exists($db_file))
{
// die('未找到数据库文件');
$this->dblink = new DOMDocument('1.0', 'utf-8');
$root = $this->dblink->createElement('root');
$this->dblink->appendChild($root);
$this->dblink->formatOutput = true; // xml文件保留缩进样式
$this->dblink->save($this->dbfile);
}
else
{
$this->dblink = new DOMDocument();
$this->dblink->formatOutput = true;
$this->dblink->load($this->dbfile);
}
}
/**
* 遍历所有元素
* ===============================================
* 标准xml文件,一个元素可能有n个属性,可用自定义键[nodevalue]获取元素值
*
*
* ===============================================
* 简单xml文件,没有属性,键值一一对应
*
*
*
* 1
* 标题一
* 详细内容一
*
*
* @param $node
* @return array
*/
function getData($node=0){
if(!$node)
{
$node = $this->dblink->documentElement;
}
$array = array();
foreach($node->attributes as $attribute)
{
$key = $attribute->nodeName;
$val = $attribute->nodeValue;
$array[$key] = $val;
}
if(count($array)) // 有属性,则用[nodevalue]键代表值
{
$array['nodevalue'] = $node->nodeValue;
}
// 递归遍历所有子元素
$node_child = $node->firstChild;
while($node_child)
{
if(XML_ELEMENT_NODE == $node_child->nodeType)
{
$tagname = $node_child->tagName;
$result = $this->getData($node_child);
if(isset($array[$tagname])) // 发现有重复tagName的子元素存在,所以改用数组存储重复tagName的所有子元素
{
if(!is_array($array[$tagname][0]))
{
$tmp = $array[$tagname];
$array[$tagname] = array();
$array[$tagname][] = $tmp;
}
$array[$tagname][] = $result;
}
else
{
$array[$tagname] = $result;
}
}
$node_child = $node_child->nextSibling;
}
if(!count($array)) // 没有子元素&没有属性=最末子元素,就返回该元素的nodeValue值
{
return $node->nodeValue;
}
return $array;
}
/**
* 把array数据写到xml文件(覆盖)
* @param $data
*/
public function setData($data,&$node=0)
{
$is_root = false;
if(!$node)
{
$is_root = true;
$node = $this->dblink->documentElement;
// 清除原数据
$remove = array();
$node_child = $node->firstChild;
while($node_child)
{
$remove[] = $node_child;
$node_child = $node_child->nextSibling;
}
foreach($remove as $r)
{
$node->removeChild($r);
}
}
if(is_array($data))
{
foreach($data as $k=>$v)
{
if(is_array($v))
{
foreach($v as $r)
{
$item = $this->dblink->createElement($k);
$result = $this->setData($r,$item);
$node->appendChild($result);
}
}
else
{
$item = $this->dblink->createElement($k);
$value = $this->dblink->createTextNode($v);
$item->appendChild($value);
$node->appendChild($item);
}
}
}
else
{
$item = $this->dblink->createTextNode($data);
$node->appendChild($item);
}
if($is_root)
{
$this->dblink->save($this->dbfile); // 覆盖写入
}
else
{
return $node;
}
}
}
简单用法示例如下:
smp.xml文件:
1
标题一
详细内容一
2
标题二
详细内容二
3
标题三
详细内容三
index.php文件:
include("xml_dom.php");
$xml=new xml_dom("smp.xml");//载入xml文件
$xmlarr=$xml->getData();//读取xml文件内容
var_dump($xmlarr);
运行结果:
array(1) {
["posts"]=>
array(3) {
[0]=>
array(3) {
["id"]=>
string(1) "1"
["title"]=>
string(9) "标题一"
["content"]=>
string(15) "详细内容一"
}
[1]=>
array(3) {
["id"]=>
string(1) "2"
["title"]=>
string(9) "标题二"
["content"]=>
string(15) "详细内容二"
}
[2]=>
array(3) {
["id"]=>
string(1) "3"
["title"]=>
string(9) "标题三"
["content"]=>
string(15) "详细内容三"
}
}
}
PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:
在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson
在线格式化XML/在线压缩XML:
http://tools.jb51.net/code/xmlformat
XML在线压缩/格式化工具:
http://tools.jb51.net/code/xml_format_compress
XML代码在线格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP针对XML文件操作技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP错误与异常处理方法总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
您可能感兴趣的文章:php中实现xml与mysql数据相互转换的方法php与XML、XSLT、Mysql的结合运用实现代码php 备份数据库代码(生成word,excel,json,xml,sql)PHP XML备份Mysql数据库用PHP实现XML备份Mysql数据库一个用于MySQL的PHP XML类PHP解析xml格式数据工具类示例PHP基于DOMDocument解析和生成xml的方法分析PHP处理数组和XML之间的互相转换php生成xml简单实例代码PHP输出XML到页面的3种方法详解php实现解析xml并生成sql语句的方法
|
|