3

  {

  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 [email protected] 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;

  }

  }

  }

  ?>