Home php教程 php手册 用php5轻松解析xml

用php5轻松解析xml

Jun 21, 2016 am 09:06 AM
gt lt name this

php5|xml

用sax方式的时候,要自己构建3个函数, 而且要直接用这三的函数来返回数据, 要求较强的逻辑. 在处理不同结构的xml的时候, 还要重新进行构造这三个函数,麻烦!

用dom方式,倒是好些,但是他把每个节点都看作是一个node, 操作起来要写好多的代码, 麻烦!

网上有好多的开源的xml解析的类库, 以前看过几个, 但是心里总是觉得不踏实, 感觉总是跟在别人的屁股后面.

这几天在搞java, 挺累的, 所以决定换换脑袋, 写点php代码, 为了防止以后xml解析过程再令我犯难, 就花了一天的时间写了下面一个xml解析的类, 于是就有了下面的东西,

实现方式是通过包装"sax方式的解析结果"来实现的. 总的来说,对于我个人来说挺实用的,性能也还可以,基本上可以完成大多数的处理要求。

功能:
1\ 对基本的xml文件的节点进行 查询 / 添加 / 修改 / 删除 工作.
2\ 导出xml文件的所有数据到一个数组里面.
3\ 整个设计采用了oo方式,在操作结果集的时候, 使用方法类似于dom

缺点:
1\ 每个节点最好都带有一个id(看后面的例子), 每个“节点名字”=“节点的标签_节点的id”,如果这个id值没有设置,程序将自动给他产生一个id,这个id就是这个节点在他的上级节点中的位置编号,从0开始。
2\ 查询某个节点的时候可以通过用“|”符号连接“节点名字”来进行。这些“节点名字”都是按顺序写好的上级节点的名字。

使用说明:
运行下面的例子,在执行结果页面上可以看到函数的使用说明

代码是通过php5来实现的,在php4中无法正常运行。

由于刚刚写完,所以没有整理文档,下面的例子演示的只是一部分的功能,代码不是很难,要是想知道更多的功能,可以研究研究源代码。

目录结构:

      test.php      test.xml      xml / SimpleDocumentBase.php      xml / SimpleDocumentNode.php      xml / SimpleDocumentRoot.php      xml / SimpleDocumentParser.php
Copy after login
文件:test.xml
<?xml version="1.0" encoding="GB2312"?><br><shop><br> <name>华联</name><br> <address>北京长安街-9999号</address>
<br> <desc>连锁超市</desc><br> <cat id="food"><br>  <goods id="food11"><br>   <name>food11</name><br>   <price>12.90</price><br>  </goods><br>  <goods id="food12"><br>   <name>food12</name><br>   <price>22.10</price><br>   <desc creator="hahawen">好东西推荐</desc><br>  </goods><br> </cat><br> <cat><br>  <goods id="tel21"><br>   <name>tel21</name><br>   <price>1290</price><br>  </goods><br> </cat><br> <cat id="coat"><br>  <goods id="coat31"><br>   <name>coat31</name><br>   <price>112</price><br>  </goods><br>  <goods id="coat32"><br>   <name>coat32</name><br>   <price>45</price><br>  </goods><br> </cat><br> <special id="hot"><br>  <goods><br>   <name>hot41</name><br>   <price>99</price><br>  </goods><br> </special><br></shop>
Copy after login
文件:test.php
<?php 
Copy after login

require_once "xml/SimpleDocumentParser.php";
require_once "xml/SimpleDocumentBase.php";
require_once "xml/SimpleDocumentRoot.php";
require_once "xml/SimpleDocumentNode.php";

$test = new SimpleDocumentParser();
$test->parse("test.xml");
$dom = $test->getSimpleDocument();

echo "

";<p>echo "</p><hr><font color="red">";<br>echo "下面是通过函数getSaveData()返回的整个xml数据的数组";<br>echo "</font><hr>";<br>print_r($dom->getSaveData());<p>echo "</p><hr><font color="red">";<br>echo "下面是通过setValue()函数,给给根节点添加信息,添加后显示出结果xml文件的内容";<br>echo "</font><hr>";<br>$dom->setValue("telphone", "123456789");<br>echo htmlspecialchars($dom->getSaveXml());<p>echo "</p><hr><font color="red">";<br>echo "下面是通过getNode()函数,返回某一个分类下的所有商品的信息";<br>echo "</font><hr>";<br>$obj = $dom->getNode("cat_food");<br>$nodeList = $obj->getNode();<br>foreach($nodeList as $node){<br>$data = $node->getValue();<br>echo "<font color="red">商品名:".$data[name]."</font><br>";<br>print_R($data);<br>print_R($node->getAttribute());<br>}<p>echo "</p><hr><font color="red">";<br>echo "下面是通过findNodeByPath()函数,返回某一商品的信息";<br>echo "</font><hr>";<br>$obj = $dom->findNodeByPath("cat_food|goods_food11");<br>if(!is_object($obj)){<br>echo "该商品不存在";<br>}else{<br>$data = $obj->getValue();<br>echo "<font color="red">商品名:".$data[name]."</font><br>";<br>print_R($data);<br>print_R($obj->getAttribute());<br>}<p>echo "</p><hr><font color="red">";<br>echo "下面是通过setValue()函数,给商品\"food11\"添加属性, 然后显示添加后的结果";<br>echo "</font><hr>";<br>$obj = $dom->findNodeByPath("cat_food|goods_food11");<br>$obj->setValue("leaveword", array("value"=>"这个商品不错", "attrs"=>array("author"=>"hahawen", "date"=>date('Y-m-d'))));<br>echo htmlspecialchars($dom->getSaveXml());<p>echo "</p><hr><font color="red">";<br>echo "下面是通过removeValue()/removeAttribute()函数,给商品\"food11\"改变和删除属性, 然后显示操作后的结果";<br>echo "</font><hr>";<br>$obj = $dom->findNodeByPath("cat_food|goods_food12");<br>$obj->setValue("name", "new food12");<br>$obj->removeValue("desc");<br>echo htmlspecialchars($dom->getSaveXml());<p>echo "</p><hr><font color="red">";<br>echo "下面是通过createNode()函数,添加商品, 然后显示添加后的结果";<br>echo "</font><hr>";<br>$obj = $dom->findNodeByPath("cat_food");<br>$newObj = $obj->createNode("goods", array("id"=>"food13"));<br>$newObj->setValue("name", "food13");<br>$newObj->setValue("price", 100);<br>echo htmlspecialchars($dom->getSaveXml());<p>echo "</p><hr><font color="red">";<br>echo "下面是通过removeNode()函数,删除商品, 然后显示删除后的结果";<br>echo "</font><hr>";<br>$obj = $dom->findNodeByPath("cat_food");<br>$obj->removeNode("goods_food12");<br>echo htmlspecialchars($dom->getSaveXml());<br>?> <pre class="brush:php;toolbar:false">
Copy after login
文件:SimpleDocumentParser.php
<?php /** *========================================================= * * @author     hahawen(大龄青年)   * @since      2004-12-04 * @copyright  Copyright (c) 2004, NxCoder Group * *========================================================= *//** * class SimpleDocumentParser * use SAX parse xml file, and build SimpleDocumentObject * all this pachage's is work for xml file, and method is action as DOM. * * @package SmartWeb.common.xml * @version 1.0 */class SimpleDocumentParser{ private $domRootObject = null; private $currentNO = null; private $currentName = null; private $currentValue = null; private $currentAttribute = null; public function getSimpleDocument() {     return $this->domRootObject; } public function parse($file) {        $xmlParser = xml_parser_create();     xml_parser_set_option($xmlParser,XML_OPTION_CASE_FOLDING, 0);     xml_parser_set_option($xmlParser,XML_OPTION_SKIP_WHITE, 1);     xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, 'UTF-8');     xml_set_object($xmlParser, $this);     xml_set_element_handler($xmlParser, "startElement", "endElement");     xml_set_character_data_handler($xmlParser, "characterData");        if (!xml_parse($xmlParser, file_get_contents($file)))            die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xmlParser)), xml_get_current_line_number($xmlParser)));     xml_parser_free($xmlParser); } private function startElement($parser, $name, $attrs) {        $this->currentName = $name;        $this->currentAttribute = $attrs;        if($this->currentNO == null)        {         $this->domRootObject = new SimpleDocumentRoot($name);         $this->currentNO = $this->domRootObject;        }        else        {         $this->currentNO = $this->currentNO->createNode($name, $attrs);        } }    private function endElement($parser, $name)    {        if($this->currentName==$name)        {         $seq = $this->currentNO->getSeq();
         $this->currentNO = $this->currentNO->getPNodeObject();
         $tag = $this->currentNO->getNodeName($seq);
Copy after login
         if($this->currentAttribute!=null && sizeof($this->currentAttribute)>0)          $this->currentNO->setValue($name, array('value'=>$this->currentValue, 'attrs'=>$this->currentAttribute));         else                $this->currentNO->setValue($name, $this->currentValue);            $this->currentNO->removeNode($tag);        }        else        {      $this->currentNO = (is_a($this->currentNO, 'SimpleDocumentRoot'))? null: $this->currentNO->getPNodeObject();        } } private function characterData($parser, $data) {        $this->currentValue = iconv('UTF-8', 'GB2312', $data); } function __destruct() {     unset($this->domRootObject); }}?>
Copy after login
文件:SimpleDocumentBase.php
<?php /** *========================================================= * * @author     hahawen(大龄青年)   * @since      2004-12-04 * @copyright  Copyright (c) 2004, NxCoder Group * *========================================================= *//** * abstract class SimpleDocumentBase * base class for xml file parse * all this pachage's is work for xml file, and method is action as DOM. * * 1\ add/update/remove data of xml file. * 2\ explode data to array. * 3\ rebuild xml file * * @package SmartWeb.common.xml * @abstract * @version 1.0 */abstract class SimpleDocumentBase{ private $nodeTag = null; private $attributes = array(); private $values = array(); private $nodes = array();    function __construct($nodeTag)    {        $this->nodeTag = $nodeTag;    }    public function getNodeTag()    {     return $this->nodeTag;    }    public function setValues($values){     $this->values = $values;    }    public function setValue($name, $value)    {     $this->values[$name] = $value;    }    public function getValue($name=null)    {     return $name==null? $this->values: $this->values[$name];    }    public function removeValue($name)    {     unset($this->values["$name"]);    }    public function setAttributes($attributes){        $this->attributes = $attributes;    }    public function setAttribute($name, $value)    {     $this->attributes[$name] = $value;    }    public function getAttribute($name=null)    {        return $name==null? $this->attributes: $this->attributes[$name];    }    public function removeAttribute($name)    {     unset($this->attributes["$name"]);    }    public function getNodesSize()    {        return sizeof($this->nodes);    }    protected function setNode($name, $nodeId)    {     $this->nodes[$name] = $nodeId;    }    public abstract function createNode($name, $attributes);    public abstract function removeNode($name);    public abstract function getNode($name=null);    protected function getNodeId($name=null)    {     return $name==null? $this->nodes: $this->nodes[$name];    }
Copy after login
    public function getNodeName($id)<br>    {<br>     $tmp = array_flip($this->nodes);<br>     return $tmp[$id];<br>    }    protected function createNodeByName($rootNodeObj, $name, $attributes, $pId)    {        $tmpObject = $rootNodeObj->createNodeObject($pId, $name, $attributes);        $key = isset($attributes[id])? $name.'_'.$attributes[id]: $name.'_'.$this->getNodesSize();        $this->setNode($key, $tmpObject->getSeq());     return $tmpObject;    }    protected function removeNodeByName($rootNodeObj, $name)    {        $rootNodeObj->removeNodeById($this->getNodeId($name));        if(sizeof($this->nodes)==1)            $this->nodes = array();     else      unset($this->nodes[$name]);    }    protected function getNodeByName($rootNodeObj, $name=null)    {     if($name==null)     {            $tmpList = array();            $tmpIds = $this->getNodeId();            foreach($tmpIds as $key=>$id)             $tmpList[$key] = $rootNodeObj->getNodeById($id);            return $tmpList;     }     else     {      $id = $this->getNodeId($name);      if($id===null)      {             $tmpIds = $this->getNodeId();             foreach($tmpIds as $tkey=>$tid)             {              if(strpos($key, $name)==0)              {               $id = $tid;               break;              }             }      }      return $rootNodeObj->getNodeById($id);     }    }    public function findNodeByPath($path)    {     $pos = strpos($path, '|');     if($posgetNode($path);        }        else        {         $tmpObj = $this->getNode(substr($path, 0, $pos));         return is_object($tmpObj)? $tmpObj->findNodeByPath(substr($path, $pos+1)): null;        }    }    public function getSaveData()    {        $data = $this->values;        if(sizeof($this->attributes)>0)         $data[attrs] = $this->attributes;        $nodeList = $this->getNode();        if($nodeList==null)         return $data;        foreach($nodeList as $key=>$node)        {         $data[$key] = $node->getSaveData();        }     return $data;    }    public function getSaveXml($level=0)    {     $prefixSpace = str_pad("", $level, "\t");     $str = "$prefixSpacenodeTag";        foreach($this->attributes as $key=>$value)         $str .= " $key=\"$value\"";        $str .= ">\r\n";        foreach($this->values as $key=>$value){            if(is_array($value))            {                $str .= "$prefixSpace\t$attvalue)                 $str .= " $attkey=\"$attvalue\"";                $tmpStr = $value[value];            }            else            {             $str .= "$prefixSpace\t\r\n": ">$tmpStr$key>\r\n";        }        foreach($this->getNode() as $node)         $str .= $node->getSaveXml($level+1)."\r\n";     $str .= "$prefixSpace$this->nodeTag>";     return $str;    }    function __destruct()    {     unset($this->nodes, $this->attributes, $this->values);    }}?>
Copy after login
文件:SimpleDocumentRoot.php
<?php /** *========================================================= * * @author     hahawen(大龄青年)   * @since      2004-12-04 * @copyright  Copyright (c) 2004, NxCoder Group * *========================================================= *//** * class SimpleDocumentRoot * xml root class, include values/attributes/subnodes. * all this pachage's is work for xml file, and method is action as DOM. * * @package SmartWeb.common.xml * @version 1.0 */class SimpleDocumentRoot extends SimpleDocumentBase{ private $prefixStr = ''; private $nodeLists = array(); function __construct($nodeTag) {        parent::__construct($nodeTag); }    public function createNodeObject($pNodeId, $name, $attributes)    {     $seq = sizeof($this->nodeLists);     $tmpObject = new SimpleDocumentNode($this, $pNodeId, $name, $seq);     $tmpObject->setAttributes($attributes);     $this->nodeLists[$seq] = $tmpObject;     return $tmpObject;    }    public function removeNodeById($id)    {        if(sizeof($this->nodeLists)==1)            $this->nodeLists = array();     else      unset($this->nodeLists[$id]);    }    public function getNodeById($id)    {     return $this->nodeLists[$id];    }    public function createNode($name, $attributes)    {        return $this->createNodeByName($this, $name, $attributes, -1);    }    public function removeNode($name)    {        return $this->removeNodeByName($this, $name);    }    public function getNode($name=null)    {        return $this->getNodeByName($this, $name);    }    public function getSaveXml()    {     $prefixSpace = "";     $str = $this->prefixStr."\r\n";     return $str.parent::getSaveXml(0);    }}?>
Copy after login
文件:SimpleDocumentNode.php
<?php /** *========================================================= * * @author     hahawen(大龄青年)   * @since      2004-12-04 * @copyright  Copyright (c) 2004, NxCoder Group * *========================================================= *//** * class SimpleDocumentNode * xml Node class, include values/attributes/subnodes. * all this pachage's is work for xml file, and method is action as DOM. * * @package SmartWeb.common.xml * @version 1.0 */class SimpleDocumentNode extends SimpleDocumentBase{ private $seq = null; private $rootObject = null;    private $pNodeId = null;    function __construct($rootObject, $pNodeId, $nodeTag, $seq)    {     parent::__construct($nodeTag);        $this->rootObject = $rootObject;        $this->pNodeId = $pNodeId;        $this->seq = $seq;    }    public function getPNodeObject()    {     return ($this->pNodeId==-1)? $this->rootObject: $this->rootObject->getNodeById($this->pNodeId);    }    public function getSeq(){     return $this->seq;    }    public function createNode($name, $attributes)    {        return $this->createNodeByName($this->rootObject, $name, $attributes, $this->getSeq());    }    public function removeNode($name)    {        return $this->removeNodeByName($this->rootObject, $name);    }    public function getNode($name=null)    {        return $this->getNodeByName($this->rootObject, $name);    }}?>
Copy after login
下面是例子运行对结果:
<hr><font color="red">下面是通过函数getSaveData()返回的整个xml数据的数组</font><hr>Array(    [name] => 华联    [address] => 北京长安街-9999号    [desc] => 连锁超市    [cat_food] => Array        (            [attrs] => Array                (                    [id] => food                )            [goods_food11] => Array                (                    [name] => food11                    [price] => 12.90                    [attrs] => Array                        (                            [id] => food11                        )                )            [goods_food12] => Array                (                    [name] => food12                    [price] => 22.10                    [desc] => Array                        (                            [value] => 好东西推荐                            [attrs] => Array                                (                                    [creator] => hahawen                                )                        )                    [attrs] => Array                        (                            [id] => food12                        )                )        )    [cat_1] => Array        (            [goods_tel21] => Array                (                    [name] => tel21                    [price] => 1290                    [attrs] => Array                        (                            [id] => tel21                        )                )        )    [cat_coat] => Array        (            [attrs] => Array                (                    [id] => coat                )            [goods_coat31] => Array                (                    [name] => coat31                    [price] => 112                    [attrs] => Array                        (                            [id] => coat31                        )                )            [goods_coat32] => Array                (                    [name] => coat32                    [price] => 45                    [attrs] => Array                        (                            [id] => coat32                        )                )        )    [special_hot] => Array        (            [attrs] => Array                (                    [id] => hot                )            [goods_0] => Array                (                    [name] => hot41                    [price] => 99                )        ))<hr><font color="red">下面是通过setValue()函数,给给根节点添加信息,添加后显示出结果xml文件的内容</font><hr><?xml version="1.0" encoding="GB2312" ?><shop> <name>华联</name> <address>北京长安街-9999号</address> <desc>连锁超市</desc> <telphone>123456789</telphone> <cat id="food">  <goods id="food11">   <name>food11</name>   <price>12.90</price>  </goods>  <goods id="food12">   <name>food12</name>   <price>22.10</price>   <desc creator="hahawen">好东西推荐</desc>  </goods> </cat> <cat>  <goods id="tel21">   <name>tel21</name>   <price>1290</price>  </goods> </cat> <cat id="coat">  <goods id="coat31">   <name>coat31</name>   <price>112</price>  </goods>  <goods id="coat32">   <name>coat32</name>   <price>45</price>  </goods> </cat> <special id="hot">  <goods>   <name>hot41</name>   <price>99</price>  </goods> </special></shop><hr><font color="red">下面是通过getNode()函数,返回某一个分类下的所有商品的信息</font><hr><font color="red">商品名:food11</font><br>Array(    [name] => food11    [price] => 12.90)Array(    [id] => food11)<font color="red">商品名:food12</font><br>Array(    [name] => food12    [price] => 22.10    [desc] => Array        (            [value] => 好东西推荐            [attrs] => Array                (                    [creator] => hahawen                )        ))Array(    [id] => food12)<hr><font color="red">下面是通过findNodeByPath()函数,返回某一商品的信息</font><hr><font color="red">商品名:food11</font><br>Array(    [name] => food11    [price] => 12.90)Array(    [id] => food11)<hr><font color="red">下面是通过setValue()函数,给商品"food11"添加属性, 然后显示添加后的结果</font><hr><?xml version="1.0" encoding="GB2312" ?><shop> <name>华联</name> <address>北京长安街-9999号</address> <desc>连锁超市</desc> <telphone>123456789</telphone> <cat id="food">  <goods id="food11">   <name>food11</name>   <price>12.90</price>   <leaveword author="hahawen" date="2004-12-05">这个商品不错</leaveword>  </goods>  <goods id="food12">   <name>food12</name>   <price>22.10</price>   <desc creator="hahawen">好东西推荐</desc>  </goods> </cat> <cat>  <goods id="tel21">   <name>tel21</name>   <price>1290</price>  </goods> </cat> <cat id="coat">  <goods id="coat31">   <name>coat31</name>   <price>112</price>  </goods>  <goods id="coat32">   <name>coat32</name>   <price>45</price>  </goods> </cat> <special id="hot">  <goods>   <name>hot41</name>   <price>99</price>  </goods> </special></shop><hr><font color="red">下面是通过removeValue()/removeAttribute()函数,给商品"food11"改变和删除属性, 然后显示操作后的结果</font><hr><?xml version="1.0" encoding="GB2312" ?><shop> <name>华联</name> <address>北京长安街-9999号</address> <desc>连锁超市</desc> <telphone>123456789</telphone> <cat id="food">  <goods id="food11">   <name>food11</name>   <price>12.90</price>   <leaveword author="hahawen" date="2004-12-05">这个商品不错</leaveword>  </goods>  <goods id="food12">   <name>new food12</name>   <price>22.10</price>  </goods> </cat> <cat>  <goods id="tel21">   <name>tel21</name>   <price>1290</price>  </goods> </cat> <cat id="coat">  <goods id="coat31">   <name>coat31</name>   <price>112</price>  </goods>  <goods id="coat32">   <name>coat32</name>   <price>45</price>  </goods> </cat> <special id="hot">  <goods>   <name>hot41</name>   <price>99</price>  </goods> </special></shop><hr><font color="red">下面是通过createNode()函数,添加商品, 然后显示添加后的结果</font><hr><?xml version="1.0" encoding="GB2312" ?><shop> <name>华联</name> <address>北京长安街-9999号</address> <desc>连锁超市</desc> <telphone>123456789</telphone> <cat id="food">  <goods id="food11">   <name>food11</name>   <price>12.90</price>   <leaveword author="hahawen" date="2004-12-05">这个商品不错</leaveword>  </goods>  <goods id="food12">   <name>new food12</name>   <price>22.10</price>  </goods>  <goods id="food13">   <name>food13</name>   <price>100</price>  </goods> </cat> <cat>  <goods id="tel21">   <name>tel21</name>   <price>1290</price>  </goods> </cat> <cat id="coat">  <goods id="coat31">   <name>coat31</name>   <price>112</price>  </goods>  <goods id="coat32">   <name>coat32</name>   <price>45</price>  </goods> </cat> <special id="hot">  <goods>   <name>hot41</name>   <price>99</price>  </goods> </special></shop><hr><font color="red">下面是通过removeNode()函数,删除商品, 然后显示删除后的结果</font><hr><?xml version="1.0" encoding="GB2312" ?><shop> <name>华联</name> <address>北京长安街-9999号</address> <desc>连锁超市</desc> <telphone>123456789</telphone> <cat id="food">  <goods id="food11">   <name>food11</name>   <price>12.90</price>   <leaveword author="hahawen" date="2004-12-05">这个商品不错</leaveword>  </goods>  <goods id="food13">   <name>food13</name>   <price>100</price>  </goods> </cat> <cat>  <goods id="tel21">   <name>tel21</name>   <price>1290</price>  </goods> </cat> <cat id="coat">  <goods id="coat31">   <name>coat31</name>   <price>112</price>  </goods>  <goods id="coat32">   <name>coat32</name>   <price>45</price>  </goods> </cat> <special id="hot">  <goods>   <name>hot41</name>   <price>99</price>  </goods> </special></shop>
Copy after login



Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
1 months ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What are the differences between Huawei GT3 Pro and GT4? What are the differences between Huawei GT3 Pro and GT4? Dec 29, 2023 pm 02:27 PM

Many users will choose the Huawei brand when choosing smart watches. Among them, Huawei GT3pro and GT4 are very popular choices. Many users are curious about the difference between Huawei GT3pro and GT4. Let’s introduce the two to you. . What are the differences between Huawei GT3pro and GT4? 1. Appearance GT4: 46mm and 41mm, the material is glass mirror + stainless steel body + high-resolution fiber back shell. GT3pro: 46.6mm and 42.9mm, the material is sapphire glass + titanium body/ceramic body + ceramic back shell 2. Healthy GT4: Using the latest Huawei Truseen5.5+ algorithm, the results will be more accurate. GT3pro: Added ECG electrocardiogram and blood vessel and safety

Fix: Snipping tool not working in Windows 11 Fix: Snipping tool not working in Windows 11 Aug 24, 2023 am 09:48 AM

Why Snipping Tool Not Working on Windows 11 Understanding the root cause of the problem can help find the right solution. Here are the top reasons why the Snipping Tool might not be working properly: Focus Assistant is On: This prevents the Snipping Tool from opening. Corrupted application: If the snipping tool crashes on launch, it might be corrupted. Outdated graphics drivers: Incompatible drivers may interfere with the snipping tool. Interference from other applications: Other running applications may conflict with the Snipping Tool. Certificate has expired: An error during the upgrade process may cause this issu simple solution. These are suitable for most users and do not require any special technical knowledge. 1. Update Windows and Microsoft Store apps

How to Fix Can't Connect to App Store Error on iPhone How to Fix Can't Connect to App Store Error on iPhone Jul 29, 2023 am 08:22 AM

Part 1: Initial Troubleshooting Steps Checking Apple’s System Status: Before delving into complex solutions, let’s start with the basics. The problem may not lie with your device; Apple's servers may be down. Visit Apple's System Status page to see if the AppStore is working properly. If there's a problem, all you can do is wait for Apple to fix it. Check your internet connection: Make sure you have a stable internet connection as the "Unable to connect to AppStore" issue can sometimes be attributed to a poor connection. Try switching between Wi-Fi and mobile data or resetting network settings (General > Reset > Reset Network Settings > Settings). Update your iOS version:

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Is watch4pro better or gt? Is watch4pro better or gt? Sep 26, 2023 pm 02:45 PM

Watch4pro and gt each have different features and applicable scenarios. If you focus on comprehensive functions, high performance and stylish appearance, and are willing to bear a higher price, then Watch 4 Pro may be more suitable. If you don’t have high functional requirements and pay more attention to battery life and reasonable price, then the GT series may be more suitable. The final choice should be decided based on personal needs, budget and preferences. It is recommended to carefully consider your own needs before purchasing and refer to the reviews and comparisons of various products to make a more informed choice.

How to optimize iPad battery life with iPadOS 17.4 How to optimize iPad battery life with iPadOS 17.4 Mar 21, 2024 pm 10:31 PM

How to Optimize iPad Battery Life with iPadOS 17.4 Extending battery life is key to the mobile device experience, and the iPad is a good example. If you feel like your iPad's battery is draining too quickly, don't worry, there are a number of tricks and tweaks in iPadOS 17.4 that can significantly extend the run time of your device. The goal of this in-depth guide is not just to provide information, but to change the way you use your iPad, enhance your overall battery management, and ensure you can rely on your device for longer without having to charge it. By adopting the practices outlined here, you take a step toward more efficient and mindful use of technology that is tailored to your individual needs and usage patterns. Identify major energy consumers

Microsoft is rolling out Windows 11 23H2 build to the release preview channel with Copilot Microsoft is rolling out Windows 11 23H2 build to the release preview channel with Copilot Sep 28, 2023 pm 07:17 PM

Everyone is looking forward to today's Windows 1123H2 release. In fact, Microsoft has just launched updates to the release preview, which is the closest channel before the official release stage. Known as Build 22631, Microsoft said they are rolling out the new rebranded chat app, phone link, and play together widgets that have been tested on other internal channels over the past few months. "This new update will have the same servicing branch and codebase as Windows 11 version 22H2 and will be cumulative with all newly announced features, including Copilot in Windows (preview)," Microsoft promises. Redmond officials further

An article that understands this point and catches up with 70% of front-end people An article that understands this point and catches up with 70% of front-end people Sep 06, 2022 pm 05:03 PM

A colleague got stuck due to a bug pointed by this. Vue2’s this pointing problem caused an arrow function to be used, resulting in the inability to get the corresponding props. He didn't know it when I introduced it to him, and then I deliberately looked at the front-end communication group. So far, at least 70% of front-end programmers still don't understand it. Today I will share with you this link. If everything is wrong If you haven’t learned it yet, please give me a big mouth.

See all articles