diff --git a/XMLDB.log b/XMLDB.log
new file mode 100644
index 0000000..e69de29
diff --git a/XMLDB.php b/XMLDB.php
new file mode 100644
index 0000000..174677c
--- /dev/null
+++ b/XMLDB.php
@@ -0,0 +1,213 @@
+
+class XMLDB{
+
+ // Path and name to the file
+ protected $_file;
+
+ // Primary key
+ protected $_primaryKey;
+
+ // XPATH
+ protected $_xpath;
+
+ // Content of the XML DB File
+ protected $_doc;
+
+ public function __construct($file, $pk = "id"){
+ ini_set("display_errors", "off");
+ ini_set("log_errors", "on");
+ ini_set('error_log', $_SERVER['DOCUMENT_ROOT'].'/test/XMLDB/XMLDB.log');
+ $this->_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();
+ }
+
+
+
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/XMLDBtestUnit.php b/XMLDBtestUnit.php
new file mode 100644
index 0000000..83dcd3d
--- /dev/null
+++ b/XMLDBtestUnit.php
@@ -0,0 +1,65 @@
+
+require_once 'XMLDB.php';
+$xmldbtest = new XMLDB('text.xml');
+if(!$xmldbtest->isLoaded()){
+ echo 'can\'t load test.xml
';
+ $xmldbtest = new XMLDB('config.xml');
+ if($xmldbtest->isLoaded()){
+ // Testing selectNode($from, $attributeName = null, $attributeValue = null, $childName = null, $childValue = null)
+ echo 'Testing empty selectNode
';
+ try {
+ $xmldbtest->selectNode();
+ }
+ catch(Exception $e){
+ echo $e->getMessage().'
';
+ }
+
+ echo 'Testing selectNode
';
+ $result = $xmldbtest->selectNode('item');
+ echo count($result).' results
';
+
+ echo 'Testing selectNode id=weather with pk
';
+ $result = $xmldbtest->selectNode('item', 'weather');
+ echo count($result).' results
';
+
+ echo 'Testing selectNode id=weather
';
+ $result = $xmldbtest->selectNode('item', null, array('id'=>'weather'));
+ echo count($result).' results
';
+
+ echo 'Testing selectNode visibility = true
';
+ $result = $xmldbtest->selectNode('item', null,null,array('visibility'=>'true'));
+ echo count($result).' results
';
+
+ echo 'Testing selectNode visibility = true and x = 32
';
+ $result = $xmldbtest->selectNode('item', null ,null,array('visibility'=>'true', 'x'=>'32'));
+ echo count($result).' results
';
+
+ echo '
Testing insertNode at XML root
';
+ if($xmldbtest->insertNode(array('name'=>'item', 'attributes'=>array('id'=>'test'), 'childs'=>array('visibility'=>'true', 'x'=>'33'))))
+ echo "ok
";
+ else
+ echo "ko
";
+
+ echo '
Testing updatingNodeAttribute with no insert
';
+ if($xmldbtest->updateNodeAttribute('item', array('id', 'links'), array('id', 'zelda')))
+ echo "ok
";
+ else
+ echo "ko
";
+
+ echo '
Testing updateNodeValue via attribute
';
+ if($xmldbtest->updateNodeValue('item', array('id', 'notes'), null, 'booga!'))
+ echo "ok
";
+ else
+ echo "ko
";
+
+ echo '
Testing deleteNode via pk
';
+ if($xmldbtest->deleteNode('item', 'test', null))
+ echo "ok
";
+ else
+ echo "ko
";
+
+ }else{
+ exit("can't load config.xml either");
+ }
+}
+
diff --git a/config.xml b/config.xml
new file mode 100644
index 0000000..f71ae76
--- /dev/null
+++ b/config.xml
@@ -0,0 +1,63 @@
+
+
+ -
+ false
+ 950
+ 42
+
+ -
+ true
+ Paris
+ 605
+ 648
+
+ -
+ true
+
+ -
+ true
+
+ -
+ true
+
+ -
+ false
+ 478
+ 73
+
+ -
+ true
+ 32
+ -2
+
+ -
+ false
+ 80
+ 10
+ Times New Roman, serif
+ 20px
+ %A %d %B %Y - %H:%M:%S
+ #000
+
+
+ -
+ false
+ 0
+ 600
+
+ -
+ true
+ 500
+ 10
+
+ -
+ false
+
+ -
+ true
+
+