charset = $ch; $this->documentInit(); $this->doc->validateOnParse = $validatenow; } function __destruct() { $this->dxpath = null; $this->doc = null; } private function documentInit($withonCreate = true) { $hg = false; if ($this->isloaded) { $guardstate = $this->doc->validateOnParse; $hg = true; unset($this->dxpath); unset($this->doc); $this->isloaded = false; } $this->doc = new DOMDocument("1.0", $this->charset); $this->doc->strictErrorChecking = true; if ($hg) { $this->doc->validateOnParse = $guardstate; } $this->doc->formatOutput = true; $this->doc->preserveWhiteSpace = true; if ($withonCreate) { $this->on_create(); } } public function viewXML() { return $this->doc->saveXML(); } public function registerNS($prefix, $nsuri) { $this->arrayPrefixNS[$prefix] = $nsuri; } public function load($fname) { // Sine xml will remain loaded should the repeated load fail we should recreate document to be empty. $this->documentInit(false); $this->isloaded = $this->doc->load($fname); if ($this->isloaded) { $this->filename = $fname; $this->processPath(); $this->is_html = false; } return $this->on_load(); } public function loadUrl($url) { $this->documentInit(); $this->isloaded = true; $this->doc->loadXML( file_get_contents($url) ); $this->is_html = false; return $this->on_load(); } public function loadHTML($content) { $this->documentInit(); $this->doc->validateOnParse = false; $this->isloaded = true; $this->doc->loadHTML($content); $this->is_html = true; return $this->on_load(); } public function loadXML($content) { $this->documentInit(); $this->doc->validateOnParse = false; $this->isloaded = true; $this->doc->load($content); $this->is_html = true; return $this->on_load(); } public function loadHTMLFile($fname) { // Sine xml will remain loaded should the repeated load fail // we should recreate document to be empty. $this->documentInit(); $this->doc->validateOnParse = false; $this->isloaded = $this->doc->loadHTMLFile($fname); if ($this->isloaded) { $this->filename = $fname; $this->processPath(); $this->is_html=true; } return $this->on_load(); } public function loadXMLFile($fname) { // Sine xml will remain loaded should the repeated load fail // we should recreate document to be empty. $this->documentInit(); $this->doc->validateOnParse = false; $this->isloaded = $this->doc->load($fname); if ($this->isloaded) { $this->filename = $fname; $this->processPath(); $this->is_html = true; } return $this->on_load(); } public function loadString($content) { $this->doc = new DOMDocument("1.0", $this->charset); $content = ''.$content.''; $this->doc->loadXML($content); return true; } public function save() { $this->saveTo($this->filename); } public function saveTo($fname) { $status = false; if ($this->on_save()) { if ($this->is_html) { $this->doc->saveHTMLFile($fname); } else { $this->doc->save($fname); } $this->filename = $fname; $this->processPath(); $status = true; } return $status; } public function validate() { return $this->doc->validate(); } public function attributeValue($path, $attrname, $node = null) { $this->chkxpath(); $result = null; $resultlist = null; if (is_null($node)) { $resultlist = $this->dxpath->query($path); } else { $resultlist = $this->dxpath->query($path, $node); } if (is_object($resultlist) && ($resultlist->length > 0) && $resultlist->item(0)->hasAttribute($attrname)) { $result = $resultlist->item(0)->getAttribute($attrname); } return $result; } /** * * Get's text value of the node based on xpath query * @param string $path * @param DOMNode $node * @param int $count * @return string */ public function nodeValue($path, $node = null, $count = 1) { $nd = $this->node($path, $node, $count); return $this->nodeTextValue($nd); } /** * * Get's text value of the node * @param DOMNode $node * @return string */ public function nodeTextValue($node) { $result = ''; if (is_object($node)) { if ($node->hasChildNodes()) { $chnodesList = $node->childNodes; $types = array(XML_TEXT_NODE, XML_CDATA_SECTION_NODE); foreach ($chnodesList as $chnode) { if (in_array($chnode->nodeType, $types)) { $result .= $chnode->wholeText; } } } } return $result; } /** * * Enter description here ... * @param string $path * @param DOMNode $nd * @param int $count * @return DOMNode */ public function node($path, $nd = null, $count = 1) { $result = null; $resultlist = $this->nodeList($path,$nd); if (is_object($resultlist) && ($resultlist->length > 0)) { $result = $resultlist->item($count - 1); } return $result; } /** * * Enter description here ... * @param string $path * @param DOMNode $node * @return DOMNodeList */ public function nodeList($path, $node = null) { $this->chkxpath(); $resultlist = null; if (is_null($node)) { $resultlist = $this->dxpath->query($path); } else { $resultlist = $this->dxpath->query($path, $node); } return $resultlist; } /** * * Create new attribute * @param string $namespace * @param string $name * @param string $value * @return DOMAttr */ public function create_attribute_ns($namespace, $name, $value = null) { $result = $this->doc->createAttributeNS($namespace, $name); if (!is_null($value)) { $result->nodeValue = $value; } return $result; } /** * * Create new attribute * @param string $name * @param string $value * @return DOMAttr */ public function create_attribute($name, $value = null) { $result = $this->doc->createAttribute($name); if (!is_null($value)) { $result->nodeValue = $value; } return $result; } /** * * Adds new node * @param DOMNode $parentnode * @param string $namespace * @param string $name * @param string $value * @return DOMNode */ public function append_new_element_ns(DOMNode &$parentnode, $namespace, $name, $value = null) { $newnode = null; if (is_null($value)) { $newnode = $this->doc->createElementNS($namespace, $name); } else { $newnode = $this->doc->createElementNS($namespace, $name, $value); } return $parentnode->appendChild($newnode); } /** * * New node with CDATA content * @param DOMNode $parentnode * @param string $namespace * @param string $name * @param string $value */ public function append_new_element_ns_cdata(DOMNode &$parentnode, $namespace, $name, $value = null) { $newnode = $this->doc->createElementNS($namespace, $name); if (!is_null($value)) { $cdata = $this->doc->createCDATASection($value); $newnode->appendChild($cdata); } return $parentnode->appendChild($newnode); } /** * * Adds new node * @param DOMNode $parentnode * @param string $name * @param string $value * @return DOMNode */ public function append_new_element(DOMNode &$parentnode, $name, $value = null) { $newnode = null; if (is_null($value)) { $newnode = $this->doc->createElement($name); } else { $newnode = $this->doc->createElement($name, $value); } return $parentnode->appendChild($newnode); } /** * * Adds new attribute * @param DOMNode $node * @param string $name * @param string $value * @return DOMNode */ public function append_new_attribute(DOMNode &$node, $name, $value = null) { return $node->appendChild($this->create_attribute($name, $value)); } /** * * Adds new attribute * @param DOMNode $node * @param string $namespace * @param string $name * @param string $value * @return DOMNode */ public function append_new_attribute_ns(DOMNode &$node, $namespace, $name, $value = null) { return $node->appendChild($this->create_attribute_ns($namespace, $name, $value)); } public function fileName() { return $this->filename; } public function filePath() { return $this->filepath; } protected function on_load() { return $this->isloaded; } protected function on_save() { return true; } protected function on_create() { return true; } public function resetXpath() { $this->dxpath = null; $this->chkxpath(); } private function chkxpath() { if (!isset($this->dxpath) || is_null($this->dxpath)) { $this->dxpath = new DOMXPath($this->doc); foreach ($this->arrayPrefixNS as $nskey => $nsuri) { $this->dxpath->registerNamespace($nskey, $nsuri); } } } protected function processPath() { $path_parts = pathinfo($this->filename); $this->filepath = array_key_exists('dirname', $path_parts) ? $path_parts['dirname']."/" : ''; } }