3
程序员文章站
2023-11-23 18:50:04
{  ...
{
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;
}
}
}
?>