原子分析器{}

在本文中

AtomLib原子分析器API

方法

姓名描述
AtomParser::__constructPHP5构造函数。
原子分析器::_default——
原子分析器::_p——
原子分析器::原子分析器PHP4构造函数。
原子分析器::cdata——
原子分析器::end_element——
原子分析器::end_ns——
原子分析器::error_handler——
原子分析器::is_declared_content_ns——
原子分析器::map_attrs将属性映射到key=“val”
原子分析器::map_xmlns将XML命名空间映射到字符串。
原子分析器::ns_to_prefix——
AtomParser::解析——
原子分析器::start_element——
原子分析器::start_ns——
AtomParser::xml_escape——

来源

类AtomParser{var$NS='http://www.w3.org/2005/Atom';var$ATOM_CONTENT_ELEMENTS=数组('CONTENT','summary','title','subtitle'、'rights');var$ATOM_SIMPLE_ELEMENTS=数组('id','updated','published','草稿');var$debug=false;var$depth=0;var$indent=2;变量$in_content;var$ns_contexts=数组();var$ns_decls=数组();var$content_ns_decls=数组();var$content_ns_contexts=数组();var$is_xhtml=假;var$ishtml=假;var$is_text=true;var$skipped_div=假;var$FILE=“php://输入";var$feed;变量;var$当前;/***PHP5构造函数。*/函数__construct(){$this->feed=新的AtomFeed();$this->current=空;$this->map_attrs_func=数组(__CLASS__,‘map_attrs’);$this->map_xmlns_func=数组(__CLASS__,'map_xmlns');}/***PHP4构造函数。*/公共函数AtomParser(){自我::__construct();}/***将属性映射到key=“val”**@param string$k键*@param string$v值*@return字符串*/公共静态函数map_attrs($k,$v){return“$k=\”$v \“”;}/***将XML命名空间映射到字符串。**@param indexish$p XML命名空间元素索引*@param array$n双元素数组对。[0=>{namespace},1=>{url}]*@return字符串'xmlns=“{url}”'或'xmlns:{namespace}=“{url}”''*/公共静态函数map_xmlns($p,$n){$xd=“xmlns”;if(0<strlen($n[0])){$xd.=美元“:{$n[0]}”;}return“{$xd}=\”{$n[1]}\“”;}函数_p($msg){if($this->debug){打印str_re泥炭(“”,$this->深度*$this->缩进)$消息。“\n”;}}函数error_handler($log_level、$log_text、$error_file、$errror_line){$this->error=$log_text;}函数parse(){set_error_handler(数组(&$this,'error_handler'));array_unshift($this->ns_contexts,array());如果(!function_exists('xml_parser_create_ns')){trigger_error(__(“PHP的XML扩展不可用。请与主机提供商联系以启用PHP的XML延伸。”);返回false;}$parser=xml_parser_create_ns();xml_set_object($parser,$this);xml_set_element_handler($parser,“start_element”,“end_element”);xml_parser_set_option($parser,xml_option_CASE_FOLDING,0);xml_parser_set_option($parser,xml_option_SKIP_WHITE,0);xml_set_character_data_handler($parser,“cdata”);xml_set_default_handler($parser,“_default”);xml_set_start_namespace_decl_handler($parser,“start_ns”);xml_set_end_namespace_decl_handler($parser,“end_ns”);$this->content='';$ret=真;$fp=fopen($this->FILE,“r”);while($data=fread($fp,4096)){if($this->debug)$this->内容。=$数据;if(!xml_parse($parser,$data,feof($fp)){/*转换器:1:错误消息,2:行号*/trigger_error(sprintf(__('XML错误:%1$s,第%2$s行')。“\n”,xml_error_string(xml_get_error_code($parser)),xml_get_current_line_number($parser));$ret=假;断裂;}}fclose($fp);xml_parser_free($parser);未设置($parser);restore_error_handler();返回$ret;}函数start_element($parser,$name,$attrs){$name_parts=爆炸(“:”,$name);$tag=array_pop($name_parts);开关($name){案例$本->NS。':馈送':$this->current=$this->提要;断裂;案例$本->NS。':条目“:$this->current=新AtomEntry();断裂;};$this->_p(“start_element('$name')”);#$this->_p(print_r($this->ns_contexts,true));#$this->_p('current('.$this->current.')');array_unshift($this->ns_contexts,$this->ns_decls);$this->depth++;if(!空($this->incontent)){$this->content_ns_decls=array();if($this->ishtml ||$this->istext)trigger_error(“在元素中找到无效内容。如果内容包含标记,则其类型不得为text或html。”);$attrs_prefix=数组();//解析属性的前缀foreach($attrs作为$key=>$value){$with_prefix=$this->ns_to_prefix($key,true);$attrs_prefix[$with_prefix[1]]=$this->xml_escape($value);}$attrs_str=连接(“”,array_map($this->map_attrs_func,array_keys($attrs前缀),array值($atrrs_prefix));if(strlen($attrs_str)>0){$attrs_str=“”$attrs_str;}$with_prefix=$this->ns_to_prefix($name);if(!$this->is_declared_content_ns($with_prefix[0])){array_push($this->content_ns_decls,$with_prefix[0]);}$xmlns_str=“”;if(计数($this->contentns_decls)>0){array_unshift($this->content_ns_contexts,$this->content_ns_decls);$xmlns_str.=join('',array_map($this->map_xmlns_func,array_keys($this->content_ns_contexts[0]),array_values($this->content_ns_contexts[0]));if(strlen($xmlns_str)>0){$xmlns_str=“”$xmlns_str;}}array_push($this->in_content,数组($tag,$this->深度,“<”.$with_prefix[1]。“{$xmlns_str}{$attrs_str}”.“>”);}否则如果(in_array($tag,$this->ATOM_CONTENT_ELEMENTS)||in_array($tag,$this->ATOM_SIMPLE_ELEMENTS){$this->in_content=array();$this->is_xhtml=$attrs['type']=='xhtml';$this->is_html=$attrs['type']=='html'||$attrs['type']=='文本/html';$this->is_text=!in_array('type',array_keys($attrs))||$attrs['type']=='text';$type=$this->is_xhtml?'XHTML:($this->is_html?“html”:($his->is_text?“text”:$attrs['type']);if(in_array('src',array_keys($attrs)){$this->current->$tag=$attrs;}其他{array_push($this->in_content,数组($tag,$this->深度,$type));}}else if($tag==“链接”){array_push($this->current->links,$attrs);}else if($tag==“类别”){array_push($this->current->categories,$attrs);}$this->ns_decls=array();}函数end_element($parser,$name){$name_parts=爆炸(“:”,$name);$tag=array_pop($name_parts);$account=计数($this->in_content);#如果我们在内容中,那么让我们继续序列化它if(!空($this->incontent)){#如果我们要结束原始内容元素#那么让我们完成内容if($this->in_content[0][0]==$tag&&$this->in_content[0][1]==$this->深度){$origtype=$this->in_content[0][2];array_shift($this->in_content);$newcontent=数组();foreach($this->in_content作为$c){if(计数($c)==3){array_push($newcontent,$c[2]);}其他{if($this->is_xhtml ||$this->is_text){array_push($newcontent,$this->xml_escape($c));}其他{array_push($newcontent,$c);}}}if(in_array($tag,$this->ATOM_CONTENT_ELEMENTS)){$this->current->$tag=array($origtype,join('',$newcontent));}其他{$this->current->$tag=join('',$newcontent);}$this->in_content=array();}else if($this->in_content[$account-1][0]==$tag&&$this->in_content[$account-1][1]==$this->深度){$this->in_content[$account-1][2]=子项($this->in_content[$ccount-1][2],0,-1)。"/>";}其他{#否则,只需完成当前元素的内容$endtag=$this->ns_to_prefix($name);array_push($this->in_content,数组($tag,$this->深度,“</$endtag[1]”);}}array_shift($this->ns_contexts);$this->depth--;if($name==($this->NS.':entry')){array_push($this->feed->条目,$this->当前);$this->current=空;}$this->_p(“end_element('$name')”);}函数start_ns($parser,$prefix,$uri){$this->_p(“starting:”.$prefix.“:”.$uri);array_push($this->ns_decls,数组($prefix,$uri));}函数end_ns($parser,$prefix){$this->_p(“ending:#”.$prefix.“#”);}函数cdata($parser,$data){$this->_p(“data:#”.str_replace(数组(“\n”)、数组(“\\n”)、修剪($data))。"#");if(!空($this->incontent)){array_push($this->in_content,$data);}}函数_default($parser,$data){#什么时候打电话?}函数ns_to_prefix($qname,$attr=false){#拆分'http://www.w3.org/1999/xhtml:div'到('http','//www.w3.org/1999/xhtml','div')$components=爆炸(“:”,$qname);#抓住最后一个(例如div)$名称=array_pop($组件);if(!空($components)){#重新联接名称空间组件$ns=连接(“:”,$components);foreach($this->nscontexts作为$context){foreach($context作为$mapping){if($mapping[1]==$ns&&strlen($mapping[0])>0){返回数组($mapping,“$mapping[0]:$name”);}}}}if($attr){返回数组(null,$name);}其他{foreach($this->nscontexts作为$context){foreach($context作为$mapping){if(strlen($mapping[0])==0){返回数组($mapping,$name);}}}}}函数is_declared_content_ns($new_mapping){foreach($this->content_ns_contexts作为$context){foreach($context作为$mapping){if($new_mapping==$mapping){返回true;}}}返回false;}函数xml_escape($content){return str_replace(数组('&','“',”“'”,'<','>'),数组('&amp;','&quot;',`&apos;',''),$内容);}}

用户贡献的笔记

你必须登录在能够发表注释或反馈之前。