{
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 * (we assume that when there's no space after * 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(
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 = trim(ereg_replace(&,&,ereg_replace(// 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
* 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]
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(//,,$string);
$mainxmlstring = preg_replace(/xmlroot->{$this->tagname}.\/>/,xmlroot->{$this->tagname}.>.$this->xmlroot->{$this->tagname}.>,$mainxmlstring);
$mainxmlstring = preg_replace(/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;
}
}
}
?>
http://www.bkjia.com/phpjc/314311.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/314311.htmltecharticle{ if (is_array($value) ! $delete) { foreach ($value as $suboption = $subvalue) { $this-{$option}[$suboption] = $subvalue; } } else { $this-$option = $value; } } } } } // these ar...