当前位置: 首页 > 后端技术 > PHP

在PHP中使用SPL库中的对象方法进行XML与数组的转换

时间:2023-03-29 20:25:22 PHP

使用PHP中SPL库中的对象方法进行XML和数组的转换这需要我们对XML格式的数据进行解析和转换。但是PHP中并没有像json_encode()和json_decode()这样的函数可以让我们方便的进行转换,所以大家在操作XML数据的时候,往往需要自己写代码来实现。今天,我们介绍了使用SPL扩展库中的一些对象方法来处理XML数据格式的转换。首先我们定义一个类,相当于封装了一个操作XML数据转换的类,方便我们以后使用。如果只是为了测试效果,直接写下面的函数也是可以的。classConvertXml{//....}XML转换为PHP数组classConvertXml{publicfunctionxmlToArray(SimpleXMLIterator$xml):array{$res=[];对于($xml->rewind();$xml->valid();$xml->next()){$a=[];如果(!array_key_exists($xml->key(),$a)){$a[$xml->key()]=[];}if($xml->hasChildren()){$a[$xml->key()][]=$this->xmlToArray($xml->current());}else{$a[$xml->key()]=(array)$xml->current()->attributes();$a[$xml->key()]['value']=strval($xml->current());}$res[]=$a;}返回$res;}//.....}$wsdl='http://flash.weather.com.cn/wmaps/xml/china.xml';$xml=newSimpleXMLIterator($wsdl,0,true);$convert=newConvertXml();//var_dump($convert->xmlToArray($xml));//array(37){//[0]=>//array(1){//["city"]=≫//array(2){//["@attributes"]=>//array(9){//["quName"]=>//string(9)"黑龙江"//["pyName"]=>//string(12)"heilongjiang"//["cityname"]=>//string(9)"Harbin"//["state1"]=>//string(1)"7"//["state2"]=>//string(1)"3"//["stateDetailed"]=>//string(15)"小雨阵雨"//["tem1"]=>//string(2)"21"//["tem2"]=>//string(2)"16"//["windState"]=>//string(21)"南风6-7到4-5"//}//["value"]=>//string(0)""//}//}//[1]=>//array(1){//["city"]=>//array(2){在这里,我们使用SimpleXMLIterator对象。从名字就可以看出,它的作用就是生成可以遍历的SimpleXMLElement对象。第一个参数是格式正确的XML文本或URL。第二个参数是一些选项参数,这里直接给0就可以了。第三个参数表示第一个参数是否为链接地址,这里我们给true。我们在客户端生成了一个SimpleXMLIterator对象并将其传递给xmlToArray()方法。这样,SimpleXMLIterator对象就可以让我们遍历每一个节点,接下来的事情就很简单了,我们只需要判断该节点是否有子节点,如果有子节点,就递归调用当前方法。如果没有子节点,则获取该节点的属性和内容。此测试链接用于获取天气信息。在返回的内容中,每个节点只有属性,没有内容。在转换后的数组中体现为value字段为空。PHP数组或对象转换为XMLclassConvertXml{//......constUNKNOWN_KEY='unknow';publicfunctionarrayToXml(array$a){$xml=newSimpleXMLElement('');$this->phpToXml($a,$xml);返回$xml->asXML();}保护函数phpToXml($value,&$xml){$node=$value;如果(is_object($node)){$node=get_object_vars($node);}if(is_array($node)){foreach($nodeas$k=>$v){if(is_numeric($k)){$k='number'.$k;}if(!is_array($v)&&!is_object($v)){$xml->addChild($k,$v);}else{$newNode=$xml->addChild($k);$this->phpToXml($v,$newNode);}}}else{$xml->addChild(self::UNKNOWN_KEY,$node);}}}var_dump($convert->arrayToXml($data));//string(84454)"//.......//"我们在arrayToXml()中,首先使用SimpleXMLElement对象创建一个基本根节点结构,然后使用phpToXml()方法创建所有节点。为什么要把它分成两种方法呢?因为需要递归调用phpToXml()方法,所以我们不需要每次递归都重新创建根节点,直接使用addChild()在根节点下添加子节点即可。在phpToXml()的代码中,我们还使用了get_object_vars()函数。即当传入的数组项的内容为对象时,可以通过该函数获取该对象的所有属性。如果你把一个对象想象成一个数组,每个属性值就是它的键值对。在遍历每个key值的时候,我们判断当前key对应的内容是数组还是对象。如果不是这两种形式的内容,则直接将当前内容添加为当前节点的子节点。如果是数组或者对象,继续递归相加,直到遍历完数组的所有内容。测试中$data的内容很长,可以直接通过测试代码的链接到Github上查看。总结一下本文的内容就是简单的学习了一个SPL扩展库中两个对象对XML操作的使用。通过它们,我们可以方便的转换XML数据格式。当然,对于XML格式的转换,我们还有其他的方法,后面再说!测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/使用PHP中SPL库中的object方法进行XML和数组的转换。PHP参考文档:《PHP7编程实战》所有媒体平台均可搜索【硬核项目经理】