📄 nusoap.php
字号:
*/function timestamp_to_iso8601($timestamp,$utc=true){ $datestr = date('Y-m-d\TH:i:sO',$timestamp); if($utc){ $eregStr = '([0-9]{4})-'. // centuries & years CCYY- '([0-9]{2})-'. // months MM- '([0-9]{2})'. // days DD 'T'. // separator T '([0-9]{2}):'. // hours hh: '([0-9]{2}):'. // minutes mm: '([0-9]{2})(\.[0-9]*)?'. // seconds ss.ss... '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's if(ereg($eregStr,$datestr,$regs)){ return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ',$regs[1],$regs[2],$regs[3],$regs[4],$regs[5],$regs[6]); } return false; } else { return $datestr; }}/*** convert ISO 8601 compliant date string to unix timestamp** @param string $datestr ISO 8601 compliant date string* @access public*/function iso8601_to_timestamp($datestr){ $eregStr = '([0-9]{4})-'. // centuries & years CCYY- '([0-9]{2})-'. // months MM- '([0-9]{2})'. // days DD 'T'. // separator T '([0-9]{2}):'. // hours hh: '([0-9]{2}):'. // minutes mm: '([0-9]{2})(\.[0-9]+)?'. // seconds ss.ss... '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's if(ereg($eregStr,$datestr,$regs)){ // not utc if($regs[8] != 'Z'){ $op = substr($regs[8],0,1); $h = substr($regs[8],1,2); $m = substr($regs[8],strlen($regs[8])-2,2); if($op == '-'){ $regs[4] = $regs[4] + $h; $regs[5] = $regs[5] + $m; } elseif($op == '+'){ $regs[4] = $regs[4] - $h; $regs[5] = $regs[5] - $m; } } return strtotime("$regs[1]-$regs[2]-$regs[3] $regs[4]:$regs[5]:$regs[6]Z"); } else { return false; }}?><?php/*** soap_fault class, allows for creation of faults* mainly used for returning faults from deployed functions* in a server instance.* @author Dietrich Ayala <dietrich@ganx4.com>* @version v 0.6.3* @access public*/class soap_fault extends nusoap_base { var $faultcode; var $faultactor; var $faultstring; var $faultdetail; /** * constructor * * @param string $faultcode (client | server) * @param string $faultactor only used when msg routed between multiple actors * @param string $faultstring human readable error message * @param string $faultdetail */ function soap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){ $this->faultcode = $faultcode; $this->faultactor = $faultactor; $this->faultstring = $faultstring; $this->faultdetail = $faultdetail; } /** * serialize a fault * * @access public */ function serialize(){ $ns_string = ''; foreach($this->namespaces as $k => $v){ $ns_string .= "\n xmlns:$k=\"$v\""; } $return_msg = '<?xml version="1.0"?'.">\n". '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"'.$ns_string.">\n". '<SOAP-ENV:Body>'. '<SOAP-ENV:Fault>'. '<faultcode>'.$this->faultcode.'</faultcode>'. '<faultactor>'.$this->faultactor.'</faultactor>'. '<faultstring>'.$this->faultstring.'</faultstring>'. '<detail>'.$this->serialize_val($this->faultdetail).'</detail>'. '</SOAP-ENV:Fault>'. '</SOAP-ENV:Body>'. '</SOAP-ENV:Envelope>'; return $return_msg; }}?><?php/*** parses an XML Schema, allows access to it's data, other utility methods* no validation... yet.* very experimental and limited. As is discussed on XML-DEV, I'm one of the people* that just doesn't have time to read the spec(s) thoroughly, and just have a couple of trusty* tutorials I refer to :)** @author Dietrich Ayala <dietrich@ganx4.com>* @version v 0.6.3* @access public*/class XMLSchema extends nusoap_base { // files var $schema = ''; var $xml = ''; // define internal arrays of bindings, ports, operations, messages, etc. var $complexTypes = array(); // target namespace var $schemaTargetNamespace = ''; // parser vars var $parser; var $position; var $depth = 0; var $depth_array = array(); /** * constructor * * @param string $schema schema document URI * @param string $xml xml document URI * @access public */ function XMLSchema($schema='',$xml=''){ $this->debug('xmlschema class instantiated, inside constructor'); // files $this->schema = $schema; $this->xml = $xml; // parse schema file if($schema != ''){ $this->debug('initial schema file: '.$schema); $this->parseFile($schema); } // parse xml file if($xml != ''){ $this->debug('initial xml file: '.$xml); $this->parseFile($xml); } } /** * parse an XML file * * @param string $xml, path/URL to XML file * @param string $type, (schema | xml) * @return boolean * @access public */ function parseFile($xml,$type){ // parse xml file if($xml != ""){ $this->debug('parsing $xml'); $xmlStr = @join("",@file($xml)); if($xmlStr == ""){ $this->setError('No file at the specified URL: '.$xml); return false; } else { $this->parseString($xmlStr,$type); return true; } } return false; } /** * parse an XML string * * @param string $xml path or URL * @param string $type, (schema|xml) * @access private */ function parseString($xml,$type){ // parse xml string if($xml != ""){ // Create an XML parser. $this->parser = xml_parser_create(); // Set the options for parsing the XML data. xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); // Set the object for the parser. xml_set_object($this->parser, $this); // Set the element handlers for the parser. if($type == "schema"){ xml_set_element_handler($this->parser, 'schemaStartElement','schemaEndElement'); xml_set_character_data_handler($this->parser,'schemaCharacterData'); } elseif($type == "xml"){ xml_set_element_handler($this->parser, 'xmlStartElement"','xmlEndElement'); xml_set_character_data_handler($this->parser,'xmlCharacterData'); } // Parse the XML file. if(!xml_parse($this->parser,$xml,true)){ // Display an error message. $errstr = sprintf('XML error on line %d: %s', xml_get_current_line_number($this->parser), xml_error_string(xml_get_error_code($this->parser)) ); $this->debug('XML parse error: '.$errstr); $this->setError('Parser error: '.$errstr); } xml_parser_free($this->parser); } else{ $this->debug('no xml passed to parseString()!!'); $this->setError('no xml passed to parseString()!!'); } } /** * start-element handler * * @param string $parser XML parser object * @param string $name element name * @param string $attrs associative array of attributes * @access private */ function schemaStartElement($parser, $name, $attrs) { // position in the total number of elements, starting from 0 $pos = $this->position++; $depth = $this->depth++; // set self as current value for this depth $this->depth_array[$depth] = $pos; // get element prefix if($prefix = $this->getPrefix($name)){ // get unqualified name $name = $this->getLocalPart($name); } else { $prefix = ''; } // loop thru attributes, expanding, and registering namespace declarations if(count($attrs) > 0){ foreach($attrs as $k => $v){ // if ns declarations, add to class level array of valid namespaces if(ereg("^xmlns",$k)){ //$this->xdebug("$k: $v"); //$this->xdebug('ns_prefix: '.$this->getPrefix($k)); if($ns_prefix = substr(strrchr($k,':'),1)){ $this->namespaces[$ns_prefix] = $v; } else { $this->namespaces['ns'.(count($this->namespaces)+1)] = $v; } if($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema'){ $this->XMLSchemaVersion = $v; $this->namespaces['xsi'] = $v.'-instance'; } } // expand each attribute $k = strpos($k,':') ? $this->expandQname($k) : $k; $v = strpos($v,':') ? $this->expandQname($v) : $v; $eAttrs[$k] = $v; } $attrs = $eAttrs; } else { $attrs = array(); } // find status, register data switch($name){ case ('all'|'choice'|'sequence'): //$this->complexTypes[$this->currentComplexType]['compositor'] = 'all'; $this->complexTypes[$this->currentComplexType]['compositor'] = $name; if($name == 'all'){ $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; } break; case 'attribute': //$this->xdebug("parsing attribute $attrs[name] $attrs[ref] of value: ".$attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']); if(isset($attrs['name'])){ $this->attributes[$attrs['name']] = $attrs; $aname = $attrs['name']; } elseif($attrs['ref']){ $aname = $attrs['ref']; $this->attributes[$attrs['ref']] = $attrs; } if(isset($this->currentComplexType)){ $this->complexTypes[$this->currentComplexType]['attrs'][$aname] = $attrs; } elseif(isset($this->currentElement)){ $this->elements[$this->currentElement]['attrs'][$aname] = $attrs; } // arrayType attribute if($this->getLocalPart($aname) == 'arrayType'){ $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])){ $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; } else { $v = ''; } if(strpos($v,'[,]')){ $this->complexTypes[$this->currentComplexType]['multidimensional'] = true; } $v = substr($v,0,strpos($v,'[')); // clip the [] if(!strpos($v,':') && isset($this->typemap[$this->XMLSchemaVersion][$v])){ $v = $this->XMLSchemaVersion.':'.$v; } $this->complexTypes[$this->currentComplexType]['arrayType'] = $v; } break; case 'complexType': if(isset($attrs['name'])){ $this->currentElement = false; $this->currentComplexType = $attrs['name']; $this->complexTypes[$this->currentComplexType] = $attrs; $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; if(isset($attrs['base']) && ereg(':Array$',$attrs['base'])){ $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; } else { $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; } $this->xdebug('processing complexType '.$attrs['name']); } break; case 'element': if(isset($attrs['type'])){ $this->xdebug("processing element ".$attrs['name']); $this->currentElement = $attrs['name']; $this->elements[ $attrs['name'] ] = $attrs; $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; $ename = $attrs['name']; } elseif(isset($attrs['ref'])){ $ename = $attrs['ref']; } else { $this->xdebug('adding complexType '.$attrs['name']); $this->currentComplexType = $attrs['name']; $this->complexTypes[ $attrs['name'] ] = $attrs; $this->complexTypes[ $attrs['name'] ]['element'] = 1; $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; } if(isset($ename) && $this->currentComplexType){ $this->complexTypes[$this->currentComplexType]['elements'][$ename] = $attrs; } break; case 'restriction': $this->xdebug("in restriction for ct: $this->currentComplexType and ce: $this->currentElement"); if($this->currentElement){ $this->elements[$this->currentElement]['type'] = $attrs['base']; } elseif($this->currentComplexType){ $this->complexTypes[$this->currentComplexType]['restrictionBase'] = $attrs['base']; if(strstr($attrs['base'],':') == ':Array'){ $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; } } break; case 'schema': $this->schema = $attrs; $this->schema['schemaVersion'] = $this->getNamespaceFromPrefix($prefix); break; case 'simpleType': $this->currentElement = $attrs['name']; $this->elements[ $attrs['name'] ] = $attrs; $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; break; } } /** * end-element handler * * @param string $parser XML parser object * @param string $name element name * @access private */ function schemaEndElement($parser, $name) { // position of current element is equal to the last value left in depth_array for my depth if(isset($this->depth_array[$this->depth])){ $pos = $this->depth_array[$this->depth]; } // bring depth down a notch $this->depth--; // move on... if($name == 'complexType'){ $this->currentComplexType = false; $this->currentElement = false; } if($name == 'element'){ $this->currentElement = false; } } /** * element content handler * * @param string $parser XML parser object * @param string $data element content * @access private */ function schemaCharacterData($parser, $data){ $pos = $this->depth_array[$this->depth]; $this->message[$pos]['cdata'] .= $data; } /**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -