3
author:一佰互联 2019-05-01 click:179
{ if (is_array($value) && ! $delete) { foreach ($value as $suboption => $subvalue) { $this->{$option}["$suboption"] = $subvalue; } } else { $this->$option = $value; } } } } } // these are the functions, which are intended to be overriden in user classes /** * * @param mixed * @return object DomNode * @access private */ function insertNewResult(&$metadata) { if ($this->xmlroot) return $this->xmlroot->new_child($this->tagNameResult, NULL); else { $this->xmlroot = $this->xmldoc->add_root($this->tagNameResult); //PHP 4.0.6 had $root->name as tagname, check for that here... if (!isset($this->xmlroot->{$this->tagname})) { $this->tagname = "name"; } return $this->xmlroot; } } /** * to be written * * @param object DomNode $parent_row * @param mixed $res * @param mixed $key * @param mixed &metadata * @return object DomNode * @access private */ function insertNewRow($parent_row, $res, $key, &$metadata) { return $parent_row->new_child($this->tagNameRow, Null); } /** * to be written * * @param object DomNode $parent * @param mixed $res * @param mixed $key * @param mixed &$metadata * @param mixed &$subrow * @return object DomNode * @access private */ function insertNewElement($parent, $res, $key, &$metadata, &$subrow) { return $parent->new_child($metadata[$key]["name"], $this->xml_encode(trim$res[$key])); } /** * to be written * * @param mixed $key * @param mixed $value * @param mixed &$metadata * @access private */ function addTableInfo($key, $value, &$metadata) { } // end functions, which are intended to be overriden in user classes // here come some helper functions... /** * make utf8 out of the input data and escape & with & and "< " with "< " * (we assume that when there"s no space after < it"s a tag, which we need in the xml) * I"m not sure, if this is the standard way, but it works for me. * * @param string text to be utfed. * @access private */ function xml_encode ($text) { if (function_exists("iconv") && isset($this->encoding_from) && isset($this->encoding_to)) { ini_set("track_errors",1); $text = iconv($this->encoding_from,$this->encoding_to,ereg_replace("&","&",ereg_replace("< ","< ",$text))); if (! isset($text) ) { if (isset($php_errormsg)) { $errormsg = "error: $php_errormsg"; } else { $errormsg = "undefined iconv error, turn on track_errors in php.ini to get more details"; } return PEAR::raiseError($errormsg,Null,PEAR_ERROR_DIE); } else { return $text; } } else { //$text = utf8_encode(ereg_replace("&","&",ereg_replace("< ","< ",$text))); $text = trim(ereg_replace("&","&",ereg_replace("< ","< ",$text)));// echo $text; } return $text; } //taken from kc@hireability.com at http://www.php.net/manual/en/function.array-merge-recursive.php /** * There seemed to be no built in function that would merge two arrays recursively and clobber * any existing key/value pairs. Array_Merge() is not recursive, and array_merge_recursive * seemed to give unsatisfactory results... it would append duplicate key/values. * * So here"s a cross between array_merge and array_merge_recursive **/ /** * * @param array first array to be merged * @param array second array to be merged * @return array merged array * @access private */ function array_merge_clobber($a1,$a2) { if(!is_array($a1) !is_array($a2)) return false; $newarray = $a1; while (list($key, $val) = each($a2)) { if (is_array($val) && is_array($newarray[$key])) { $newarray[$key] = $this->array_merge_clobber($newarray[$key], $val); } else { $newarray[$key] = $val; } } return $newarray; } /** * Adds a xml string to $this->xmldoc. * It"s inserted on the same level as a "normal" resultset, means just as a children of <root> * if a xpath expression is supplied, it takes that for selecting only part of the xml-file * * the clean code works only with php 4.0.7 * for php4.0.6 : * I found no cleaner method than the below one. it"s maybe nasty (xmlObject->string->xmlObject), * but it works. If someone knows how to add whole DomNodes to another one, let me know... * * @param string xml string * @param mixed xpath either a string with the xpath expression or an array with "xpath"=>xpath expression and "root"=tag/subtag/etc, which are the tags to be inserted before the result * @access private */ function doXmlString2Xml ($string,$xpath = Null) { //check if we have a recent domxml. otherwise use the workaround... $version = explode(".",phpversion()); if (! ($version[0] <= 4 and $version[1] <= 0 and $version[2] < 7) ){ if (is_array($xpath)) { if (isset($xpath["root"])) { $root = $xpath["root"]; } $xpath = $xpath["xpath"]; } $tmpxml = xmldoc($string); $subroot = $this->xmlroot; if (isset($root)) { $roots = explode("/",$root); foreach ($roots as $rootelement) { if ( strlen($rootelement) > 0 ) { $subroot = $subroot->new_child($rootelement,""); } } } //$this->xmlroot->addchild does some strange things when added nodes from xpath.... so this comment helps out $newchild = $subroot->add_child($this->xmldoc->create_comment("the purpose of this comment is a workaround in sql2php.php line ".__LINE__)); // if no xpath is given, just take the whole file if ( (is_null($xpath))) { $newchild->append_child($tmpxml->root()); } else { $xctx = $tmpxml->xpath_new_context(); $xnode = xpath_eval($xctx,$xpath); foreach ($xnode->nodeset as $node) { $newchild->append_child($node); } } } else { $MainXmlString = $this->xmldoc->dumpmem(); $string = preg_replace("/<?xml.*?>/","",$string); $MainXmlString = preg_replace("/<".$this->xmlroot->{$this->tagname}."/>/","<".$this->xmlroot->{$this->tagname}."></".$this->xmlroot->{$this->tagname}.">",$MainXmlString); $MainXmlString = preg_replace("/</".$this->xmlroot->{$this->tagname}.">/",$string."</".$this->xmlroot->{$this->tagname}.">",$MainXmlString); $this->xmldoc = xmldoc($MainXmlString); $this->xmlroot = $this->xmldoc->root(); } } /** * sets the encoding for the db2xml transformation * @param string $encoding_from encoding to transform from * @param string $encoding_to encoding to transform to * @access public */ function setEncoding ($encoding_from = "ISO-8859-1", $encoding_to ="UTF-8") { $this->encoding_from = $encoding_from; $this->encoding_to = $encoding_to; } /** * @param array $parentTables parent to child relation * @access public */ function SetParentTables($parentTables) { foreach ($parentTables as $table => $parent) { $table_info["parent_table"][$table]=$parent; } $this->SetOptions(array("user_tableInfo"=>$table_info)); } /** * returns the content of the first match of the xpath expression * * @param string $expr xpath expression * @return mixed content of the evaluated xpath expression * @access public */ function getXpathValue ($expr) { $xpth = $this->xmldoc->xpath_new_context(); $xnode = xpath_eval($xpth,$expr); if (isset ($xnode->nodeset[0])) { $firstnode = $xnode->nodeset[0]; $children = $firstnode->children(); $value = $children[0]->content; return $value; } else { return Null; } } /** * get the values as an array from the childtags from the first match of the xpath expression * * @param string xpath expression * @return array with key->value of subtags * @access public */ function getXpathChildValues ($expr) { $xpth = $this->xmldoc->xpath_new_context(); $xnode = xpath_eval($xpth,$expr); if (isset ($xnode->nodeset[0])) { foreach ($xnode->nodeset[0]->children() as $child) { $children = $child->children(); $value[$child->{$this->tagname}] = $children[0]->content; } return $value; } else { return Null; } }}?>