note 73793 added to ref.dom

From: Date: Sat, 10 Mar 2007 15:35:00 +0000
Subject: note 73793 added to ref.dom
Groups: php.notes 
Request: Send a blank email to php-notes+get-124304@lists.php.net to get a copy of this message
I wrote a couple of functions to: - create a DOMDocument from a file - parse the namespaces in it - create a XPath object with all the namespaces registered - load the schemalocations - validate the file on the main schema (the one without prefix) It is useful for me, see if it is also for someone else!! Giulio function decodeNode($node) { $out = $node->ownerDocument->saveXML($node); $re = "{^<((?:\\w*:)?\\w*)". //the tag name "[\\s\n\r]*((?:[\\s\n\r]*". "(?:\\w*:)?\\w+[\\s\n\r]*=[\\s\n\r]*". //possible attribute name "(?:\"[^\"]*\"|\'[^\']*\'))*)". //attribute value "[\\s\n\r]*>[\r\n]*". "((?:.*[\r\n]*)*)". //content "[\r\n]*</\\1>$}"; //closing tag preg_match($re, $out, $mat); return $mat; } function innerXml($node) { $mat = decodeNode($node); return $mat[3]; } function getnodeAttributes($node) { $mat = decodeNode($node); $txt = $mat[2]; $re = "{((?:\\w*:)?\\w+)[\\s\n\r]*=[\\s\n\r]*(\"[^\"]*\"|\'[^\']*\')}"; preg_match_all($re, $txt, $mat); $att = array(); for ($i=0; $i<count($mat[0]); $i++) { $value = $mat[2][$i]; if ($value[0] == "\'" || $value[0] == "\"") { $len = strlen($value); $value = substr($value, 1, strlen($value)-2); } $att[ $mat[1][$i] ] = $value; } return $att; } function loadXml($file) { $doc = new DOMDocument(); $doc->load($file); //cerca l'attributo xmlns $xsi = false; $doc->namespaces = array(); $doc->xpath = new DOMXPath($doc); $attr = getnodeAttributes($doc->documentElement); foreach ($attr as $name => $value) { if (substr($name,0,5) == "xmlns") { $uri = $value; $pre = $doc->documentElement->lookupPrefix($uri); if ($uri == "http://www.w3.org/2001/XMLSchema-instance") $xsi = $pre; $doc->namespaces[$pre] = $uri; if ($pre == "") $pre = "noname"; $doc->xpath->registerNamespace($pre, $uri); } } if ($xsi) { $doc->schemaLocations = array(); $lst = $doc->xpath->query("//@$xsi:schemaLocation"); foreach($lst as $el) { $re = "{[\\s\n\r]*([^\\s\n\r]+)[\\s\n\r]*([^\\s\n\r]+)}"; preg_match_all($re, $el->nodeValue, $mat); for ($i=0; $i<count($mat[0]); $i++) { $value = $mat[2][$i]; $doc->schemaLocations[ $mat[1][$i] ] = $value; } } $olddir = getcwd(); chdir(dirname($file)); $schema = $doc->schemaLocations[$doc->namespaces[""]]; if (substr($schema,0,7) == "file://") { $schema = substr($value,7); } if (!$doc->schemaValidate($schema)) dbg()->err("Invalid file"); chdir($olddir); } return $doc; } ---- Server IP: 213.92.11.19 Probable Submitter: 87.3.37.153 ---- Manual Page -- http://www.php.net/manual/en/ref.dom.php Edit -- https://master.php.net/note/edit/73793 Del: integrated -- https://master.php.net/note/delete/73793/integrated Del: useless -- https://master.php.net/note/delete/73793/useless Del: bad code -- https://master.php.net/note/delete/73793/bad+code Del: spam -- https://master.php.net/note/delete/73793/spam Del: non-english -- https://master.php.net/note/delete/73793/non-english Del: in docs -- https://master.php.net/note/delete/73793/in+docs Del: other reasons-- https://master.php.net/note/delete/73793 Reject -- https://master.php.net/note/reject/73793 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#124304) next »