本文實例講述了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) "詳細內容三" } }}
希望本文所述對大家PHP程序設計有所幫助。
新聞熱點
疑難解答
圖片精選