PHP封装的XML简单操作类完整实例

时间:2021-05-26

本文实例讲述了PHP封装的XML简单操作类。分享给大家供大家参考,具体如下:

xml_dom.php封装类文件:

<?php/** * Class xml_dom *nodeType:1 XML_ELEMENT_NODE(元素类型)2 XML_ATTRIBUTE_NODE3 XML_TEXT_NODE4 XML_CDATA_SECTION_NODE5 XML_ENTITY_REFERENCE_NODE6 XML_ENTITY_NODE7 XML_PROCESSING_INSTRUCTION_NODE8 XML_COMMENT_NODE(注释类型)9 XML_DOCUMENT_NODE10 XML_DOCUMENT_TYPE_NODE11 XML_DOCUMENT_FRAGMENT_NODE12 XML_NOTATION_NODE *PHP DOMDocument操作:属性:Attributes 存储节点的属性列表(只读)childNodes 存储节点的子节点列表(只读)dataType 返回此节点的数据类型Definition 以DTD或XML模式给出的节点的定义(只读)Doctype 指定文档类型节点(只读)documentElement 返回文档的根元素(可读写)firstChild 返回当前节点的第一个子节点(只读)Implementation 返回XMLDOMImplementation对象lastChild 返回当前节点最后一个子节点(只读)nextSibling 返回当前节点的下一个兄弟节点(只读)nodeName 返回节点的名字(只读)nodeType 返回节点的类型(只读)nodeTypedValue 存储节点值(可读写)nodeValue 返回节点的文本(可读写)ownerDocument 返回包含此节点的根文档(只读)parentNode 返回父节点(只读)Parsed 返回此节点及其子节点是否已经被解析(只读)Prefix 返回名称空间前缀(只读)preserveWhiteSpace 指定是否保留空白(可读写)previousSibling 返回此节点的前一个兄弟节点(只读)Text 返回此节点及其后代的文本内容(可读写)url 返回最近载入的XML文档的URL(只读)Xml 返回节点及其后代的XML表示(只读)方法:appendChild 为当前节点添加一个新的子节点,放在最后的子节点后cloneNode 返回当前节点的拷贝createAttribute 创建新的属性createCDATASection 创建包括给定数据的CDATA段createComment 创建一个注释节点createDocumentFragment 创建DocumentFragment对象createElement 创建一个元素节点createEntityReference 创建EntityReference对象createNode 创建给定类型,名字和命名空间的节点createPorcessingInstruction 创建操作指令节点createTextNode 创建包括给定数据的文本节点getElementsByTagName 返回指定名字的元素集合hasChildNodes 返回当前节点是否有子节点insertBefore 在指定节点前插入子节点Load 导入指定位置的XML文档loadXML 导入指定字符串的XML文档removeChild 从子结点列表中删除指定的子节点replaceChild 从子节点列表中替换指定的子节点Save 把XML文件存到指定节点selectNodes 对节点进行指定的匹配,并返回匹配节点列表selectSingleNode 对节点进行指定的匹配,并返回第一个匹配节点transformNode 使用指定的样式表对节点及其后代进行转换 * */class xml_dom{ protected $dblink; // xml连接 protected $dbfile; // xml文件路径 /** * xml文件 构造类 * @param $db_file xml文件 */ public function __construct($db_file) { $this->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 version="1.0" encoding="utf-8"?> * <table name="posts"> * <column name="id">1</column> * <column name="title">标题一</column> * <column name="content">详细内容一</column> * </table> * =============================================== * 简单xml文件,没有属性,键值一一对应 * <?xml version="1.0" encoding="utf-8"?> * <root> * <posts> * <id>1</id> * <title>标题一</title> * <content>详细内容一</content> * </posts> * </root> * @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文件:

<?xml version="1.0" encoding="utf-8"?><root> <posts> <id>1</id> <title>标题一</title> <content>详细内容一</content> </posts> <posts> <id>2</id> <title>标题二</title> <content>详细内容二</content> </posts> <posts> <id>3</id> <title>标题三</title> <content>详细内容三</content> </posts></root>

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程序设计有所帮助。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章