_primaryKey = $pk; $this->_file = $file; $this->_doc = new DOMDocument; if(@$this->_doc->load($this->_file)) $this->_xpath = new DOMXpath($this->_doc); else{ $this->_file = $file; $this->_doc = null; $this->xpath = null; } } public function isLoaded(){ if($this->_doc != null) return true; else return false; } public function setPrimaryKey($pk){ $this->_primaryKey = $pk; } public function getPrimaryKey(){ return $this->_primaryKey; } public function getXPath(){ return $this->_xpath; } /** * Saving the DB file */ public function save(){ if($this->_doc != null && $this->_file != null){ $this->_doc->save($this->_file); return true; }else{ return false; } } /** * Allows you to get an array of the node you're looking for based on a "where" search thanks to child or attribute value * @param $from string Name of the node you're looking for * @param $id string value of the primary key * @param $childs array name/value of the child node * @param $attributes array name/value of the attribute * @return array */ // TODO other format public function selectNode($from, $id = null, $attributes = null, $childs = null, $format = 'array'){ if (!$from) { throw new Exception('uhoh, no "where" statement?'); } if($id != null){ $attribute .= '[@' . $this->_primaryKey . ' = "' . $id . '"]'; } if($attributes != null){ foreach($attributes as $attributeName=>$attributeValue) $attribute .= '[@' . $attributeName . ' = "' . $attributeValue . '"]'; } if($childs != null){ foreach($childs as $childName=>$childValue) $child .= '/' . $childName . '[.="' . $childValue . '"]'; } $request = $this->_xpath->query('//'.$from.$attribute.$child); $requestLength = $request->length; if($format == "array"){ //$return = array('length'=>$requestLength, 'request'=>'//'.$from.$attribute.$child); foreach($request as $element){ if($childName != null && $childValue != null) $element = $element->parentNode; $elementValue = $element->attributes->item(0)->value; $return[$elementValue]['attributes'] = array(); $return[$elementValue]['childs'] = array(); //Retrieving Attributes $attributes = $element->attributes; $length = $attributes->length; for ($i = 1; $i <= $length; $i++) { $return[$elementValue]['attributes'][$attributes->item($i)->name] = $attributes->item($i)->value; } // Retrivieving childs $nodes = $element->childNodes; $length = $nodes->length; for ($i = 1; $i <= $length; $i++) { $return[$elementValue]['childs'][$nodes->item($i)->nodeName] = $nodes->item($i)->nodeValue; } } }else if($format == "node"){ $return = $request; } return $return; } /** * Allows you to insert a node into your DB thanks to an array * @param $node array * @param $where string in which node you want to put it. By default, the root of the xml file * @param $position string 'before' or 'after' * @return bool */ // TODO other $where and $position public function insertNode($node, $where = null, $position = null){ if(!is_array($node) || !isset($node['name'])) return false; // Creating the node from an array $element = $this->_doc->createElement($node['name']); if(isset($node['attributes'])){ foreach($node['attributes'] as $attributeName=>$attributeValue){ $element->setAttribute($attributeName, $attributeValue); } } if(isset($node['childs'])){ foreach($node['childs'] as $childName=>$childValue){ $newElement = $this->_doc->createElement($childName, $childValue); $element->appendChild($newElement); } } // Inserting the node into the DB if($where == null){ $this->_doc->firstChild->appendChild($element); } return $this->save(); } /** * * @param $node string * @param $oldAttribute string name of the attribute you want to change * @param $newAttribute array name/value of the attribute you want to add * @param $forceInsert bool * @return bool */ public function updateNodeAttribute($node, $oldAttribute, $newAttribute, $forceInsert = false){ $request = $this->selectNode($node, null, array($oldAttribute[0]=>$oldAttribute[1]), null, 'node'); if($request->length == 1){ if(!$forceInsert){ $request->item(0)->setAttribute($oldAttribute[0],$newAttribute[1]); }else{ $request->item(0)->setAttribute($newAttribute[0],$newAttribute[1]); } return $this->save(); } else return false; } /** * * @param $node string * @param $value string new value of the node * @return bool */ public function updateNodeValue($node, $attribute = null, $child = null, $value){ $request = $this->selectNode($node, null, array($attribute[0]=>$attribute[1]), null, 'node'); //$request = $this->_xpath->query('//'.$node.'[@' . $attribute[0] . ' = "' . $attribute[1] . '"]'); if($request->length == 1){ $request = $request->item(0); $newText = new DOMText($value); $request->removeChild($request->firstChild); $request->appendChild($newText); return $this->save(); } else return false; } public function deleteNode($node, $id = null, $attributes = null){ if($id != null && $attributes != null) return false; if($id != null) $request = $this->selectNode($node, $id, null, null, 'node')->item(0); if($attributes != null) $request = $this->selectNode($node, null, array($attribute[0]=>$attribute[1]), null, 'node')->item(0); $request->parentNode->removeChild($request); return $this->save(); } }