手机
3
摘要:{if(is_array($value)&&!$delete){foreach($valueas$suboption=>$subvalue)...

{

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

/**

*

* @parammixed

* @returnobjectDomNode

* @accessprivate

*/

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

*

* @paramobject DomNode $parent_row

* @parammixed $res

* @parammixed $key

* @parammixed &metadata

* @returnobject DomNode

* @access private

*/

function insertNewRow($parent_row, $res, $key, &$metadata)

{

return$parent_row->new_child($this->tagNameRow, Null);

}

/**

*to be written

*

* @paramobject DomNode $parent

* @parammixed $res

* @parammixed $key

* @parammixed &$metadata

* @parammixed &$subrow

* @returnobject 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

*

* @parammixed $key

* @parammixed $value

* @parammixed &$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.

*

* @paramstring 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

**/

/**

*

* @paramarray first array to be merged

* @paramarray second array to be merged

* @returnarray 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...

*

* @paramstring xml string

* @parammixed xpatheither a string with the xpath expression or an array with "xpath"=>xpath expressionand "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

* @paramstring $encoding_from encoding to transform from

* @paramstring $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

*

* @paramstring $expr xpath expression

* @returnmixed content of the evaluated xpath expression

* @accesspublic

*/

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

*

* @paramstring xpath expression

* @returnarray with key->value of subtags

* @accesspublic

*/

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;

}

}

}

?>

【3】相关文章:

30分钟学会用PHP写带数据库的简单通讯录第1/3页

Ubuntu12下编译安装PHP5.3开发环境

PHP中3种生成XML文件方法的速度效率比较

修改Laravel5.3中的路由文件与路径

在win系统安装配置 Memcached for PHP 5.3 图文教程

PHP 源代码分析 Zend HashTable详解第1/3页

awk简介与学习笔记收集第1/3页

PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析

session在php5.3中的变化 session_is_registered() is deprecated in

php5.3 废弃函数小结

精品推荐
分类导航