PHP如何读取xml文件?php读取xml文档例子
一,什么是xml,xml有什么用途
XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。
XML的用途很多,可以用来存储数据,可以用来做数据交换,为很多种应用软件提示数据等等。
二,php读取xml的方法
xml源文件
代码如下 | 复制代码 |
<?xml version="1.0 encoding="UTF-8"?> |
2)simplexml读取xml
代码如下 | 复制代码 |
<?php $xml_array=simplexml_load_file('person.xml'); //将XML中的数据,读取到数组对象中 foreach($xml_array as $tmp){ echo $tmp->name."-".$tmp->sex."-".$tmp->old."<br>"; } ?> 如果你使用 curl 获取的 xml data $xml = simplexml_load_string($data); $data['tk'] = json_decode(json_encode($xml),TRUE); 如果是直接获取 URL 数据的话 $xml = simplexml_load_file($data); $data['tk'] = json_decode(json_encode($xml),TRUE); |
先把 simplexml 对象转换成 json,再将 json 转换成数组。
3)用php正则表达式来记取数据
代码如下 | 复制代码 |
<?php $xml = ""; $f = fopen('person.xml', 'r'); while( $data = fread( $f, 4096 ) ) { $xml .= $data; } fclose( $f ); // 上面读取数据 preg_match_all( "/\<humans\>(.*?)\<\/humans\>/s", $xml, $humans ); //匹配最外层标签里面的内容 foreach( $humans[1] as $k=>$human ) { preg_match_all( "/\<name\>(.*?)\<\/name\>/", $human, $name ); //匹配出名字 preg_match_all( "/\<sex\>(.*?)\<\/sex\>/", $human, $sex ); //匹配出性别 preg_match_all( "/\<old\>(.*?)\<\/old\>/", $human, $old ); //匹配出年龄 } foreach($name[1] as $key=>$val){ echo $val." - ".$sex[$key][1]." - ".$old[$key][1]."<br>" ; } ?> |
4)xmlreader来读取xml数据
代码如下 | 复制代码 |
<?php $reader = new XMLReader(); $reader->open('person.xml'); //读取xml数据 $i=1; while ($reader->read()) { //是否读取 if ($reader->nodeType == XMLReader::TEXT) { //判断node类型 if($i%3){ echo $reader->value; //取得node的值 }else{ echo $reader->value."<br>" ; } $i++; } } ?> |
三,小结
读取xml的方法很多,简单举几个。上面四种方法都是可以把标签中的数据读出来,张映.但是他们的测重点不同,前三种方法的读取xml的function的设计重点,是为了读取标签中的值,相当于jquery中的text()方法,而xmlreader呢他就不太一样,他的重点不在读取标签中的值,而读取标签的属性,把要传送的数据,都放在属性中(不过我上面写的那个方法还是取标签中的值,因为xml文件已经给定了,我就不想在搞xml文件出来了)。
举个例子解释一下,
代码如下 | 复制代码 |
<data name=’张映’ sex=’男’ old=’28′></data> |
xmlreader的设计重点是为了读data里面的name sex old的值,而读取的内容就比较麻烦了。他相当于jquery中attr(”);这个东西。
php操作xml类主要是针对xml文件夹一个读取查询删除数据例子,下面一起来看看,目前此类暂只支持三级节点哦。文件名:xml.class.php
代码如下 | 复制代码 |
/*** * * * 文件名: xml.php * * 作 用: xml类,完善中,暂只支持三级节点 * * 作 者: loking(biyees) * * * * example 读取数据: * * $xml = new xml(“dbase.xml”,’table’); * * $data=$xml->xml_fetch_array(); * * echo ”<pre style=\”font-size:12px;\”>”; * * print_r($data); * * * ******************/ class xml{ var $dbase; //数据库,要读取的XML文件 var $dbname; //数据库名称,顶层元素,与数据库文件名称一致 var $dbtable; //数据表,要取得的节点 var $parser; //剖析器 var $vals; //属性 var $index; //索引 var $dbtable_array;//节点数组 var $array; //下级节点的数组 var $result; //返回的结果 var $querys; function xml($dbase,$dbtable){ $this->dbase=$dbase; $this- >dbname=”document”; $this- >dbtable=$dbtable; $data=$this- >ReadXml($this->dbase); if(!$data){ die( ”无法读取 $this->dbname.xml”); } $this- >parser = xml_parser_create(); xml_parser_set_option($this- >parser,XML_OPTION_CASE_FOLDING,0); xml_parser_set_option($this- >parser,XML_OPTION_SKIP_WHITE,1); xml_parse_into_struct($this- >parser,$data,$this->vals,$this->index); xml_parser_free($this- >parser); //遍历索引,筛选出要取值的节点 节点名:$dbtable foreach ($this- >index as $key=>$val) { if ($key == $this- >dbtable) { //取得节点数组 $this- >dbtable_array = $val; } else { continue; } } for ($i=0; $i < count($this->dbtable_array); $i+=2) { $offset = $this- >dbtable_array[$i] + 1; $len = $this- >dbtable_array[$i + 1] - $offset; //array_slice() 返回根据 offset 和 length 参数所指定的 array 数组中的一段序列。 //所取节点下级数组 $value=array_slice($this- >vals,$offset,$len); //取得有效数组,合并为结果数组 $this- >array[]=$this->parseEFF($value); } return true; } //将XML文件读入并返回字符串 function ReadXml($file) { return file_get_contents($file); } //取得有效数组 function parseEFF($effective) { for ($i=0; $i < count($effective); $i++){ $effect[$effective[$i][ "tag"]] = $effective[$i]["value"]; } return $effect; } //xml_query(方法,条件,多条件时逻辑运算符and or or,总数据数组,插入或更新的数组) function xml_query($method,$condition,$if=’and’,$array=array()) { if(($method==’select’)||($method==’count’)){ return $this- >xml_select($method,$condition,$if); } elseif($method==’insert’) { return $this- >xml_insert($condition,$if,$array); } elseif($method==’update’) { return $this- >xml_update($condition,$if,$array); } } //取得xml数组 function xml_fetch_array($condition,$if) { //$this- >querys++; $row = $this- >array; //初始化数据数组 if($condition) { //是否有条件,如有条件则生成符合条件的数组 //生成条件数组,条件格式 field,operator,match $condition=explode( ”,”,$condition);//条件数组 $cs=count($condition)/3; //条件数 for($i=0;$i <$cs;$i++){ $conditions[]=array( ”field”=>$condition[$i*3],”operator”=>$condition[$i*3+1],”match”=>$condition[$i*3+2]); } //echo count($row); for($r=0;$r <count($row);$r++){ for($c=0;$c <$cs;$c++){ //$i++; $condition=$conditions[$c]; //当前条件 $field=$condition['field']; //字段 $operator=$condition[ "operator"];//运算符 $match=$condition['match']; //匹配 if(($operator==’=') &&($row[$r][$field]==$match)){ $true++;//若条件符合,符合数加1 } elseif(($operator==’!=’) &&($row[$r][$field]!=$match)){ $true++;//若条件符合,符合数加1 } elseif(($operator==’ <’)&&($row[$r][$field]<$match)){ $true++;//若条件符合,符合数加1 } elseif(($operator==’ <=’)&&($row[$r][$field]<=$match)){ $true++;//若条件符合,符合数加1 } elseif(($operator==’ >’)&&($row[$r][$field]>$match)){ $true++;//若条件符合,符合数加1 } elseif(($operator==’ >’)&&($row[$r][$field]>=$match)){ $true++;//若条件符合,符合数加1 } } //根据条件取值 if($if==’and’){ //如果多条件为and,当符合数等于条件数时,生成数组 if($true==$cs){ $result[]=$row[$r]; } } else { //如果多条件为or,当有符合纪录时,生成数组 if($true!=0){ $result[]=$row[$r]; } } //echo $true; //echo ”<pre style=\”font-size:12px;\text-align:left\”>”; //print_r($true); $true=0;//符合条件数归零,进入下一轮循环 } } else { $result=$this- >array; } //echo ”<pre style=\”font-size:12px;\text-align:left\”>”; //print_r($this- >result); return $result; } //筛选或统计 function xml_select($method,$condition,$if) { $result=$this- >xml_fetch_array($condition,$if); if($method==’select’){ return $result; } else { return count($result); } } //插入数据 function xml_insert($condition,$if,$array) { $data=$this- >xml_fetch_array($condition,$if);//总数据数组 $data[]=$array; //插入后的总数据数组 $this- >array=$data; //更新总数组 $this- >WriteXml($data); } //得到更新的XML并改写 function xml_update($condition,$if,$array){ $datas=$this- >array; //总数据数组 $subtract=$this- >xml_fetch_array($condition,$if);//要更新的数组 //echo ”<pre style=\”font-size:12px;\text-align:left\”>”; //print_r($data); //print_r($datas); //echo ”每条记录中有“.count($datas[0]).”个值<br>”; for($i=0;$i <count($datas);$i++){ $data=$datas[$i]; //echo ”原始记录中的第“.$i.”条<br>”; foreach($data as $k= >$v){ //echo ”-第“.$i.”条的“.$k.”值为“.$v.”<br>”; //echo ”–要查找的数组“.$k.”值为“.$subtract[0][$k].”<br>”; if($v==$subtract[0][$k]){ $is++; } } if($is==count($data)){ //echo ”—-与第“.$i.”条符合<br>”; $datas[$i]=$array; //array_splice($datas,$i,$i+1); } //echo ”原始记录中的第“.$i.”条与要查找的有“.$is.”匹配<br>”; //echo ”原始记录中的第“.$i.”条结束<br>”; $is=0; } //array_splice($datas,2,2+1,$array); //echo ”<pre style=\”font-size:12px;\text-align:left\”>”; //print_r($datas); $this- >array=$datas; $this- >WriteXml($datas); } //写入XML文件(全部写入) function WriteXml($array) { if(!is_writeable($this- >dbase)){ die( ”无法写入“.$this->dbname.”.xml”); } $xml.= ”<?xml version=\”1.0\” encoding=\”gb2312\”?>\r\n”; $xml.= ”<$this->dbname>\r\n”; for($i=0;$i <count($array);$i++){ $xml.= ”<$this->dbtable>\r\n”; foreach($array[$i] as $k= >$s){ $xml.= ”<$k>$s</$k>\r\n”; } $xml.= ”</$this->dbtable>\r\n”; } $xml.= ”</$this->dbname>”; dbase,”w’>$fp=@fopen($this->dbase,”w”); flock($fp, LOCK_EX); rewind($fp); fputs($fp,$xml); fclose($fp); } //逐行写入xml(我试着写入10000行,感觉没一次写入快,所以没用这种写入方式) function WriteLine($array) { if(!is_writeable($this- >dbase)){ die( ”无法写入“.$this->dbname.”.xml”); } dbase,”w’>$fp=@fopen($this->dbase,”w”); rewind($fp); flock($fp, LOCK_EX); fputs($fp, ”<?xml version=\”1.0\” encoding=\”gb2312\”?>\r\n”); fputs($fp, ”<$this->dbname>\r\n”); for($i=0;$i <count($array);$i++){ fputs($fp, ”<$this->dbtable>\r\n”); $xml.= ”<$this->dbtable>\r\n”; foreach($array[$i] as $k= >$s){ fputs($fp, ”<$k>$s</$k>\r\n”); } fputs($fp, ”</$this->dbtable>\r\n”); } fputs($fp, ”</$this->dbname>”); fclose($fp); } } ?> |
使用方法:
插入一条记录
代码如下 | 复制代码 |
require_once(‘xml.class.php’); $xml = new xml(“exemple.xml”,”item”); $newarray = array( “title”=>”XML标题“, “text”=>”PHP的XML类测试!“ ); $insert=$xml->xml_query(‘insert’,”,”,$newarray);//第二及第三个变量位置是条件,留空表示在最后插入 修改记录 require_once(‘xml.class.php’); $xml = new xml(“exemple.xml”,”item”); $array = array( “title”=>”XML标题“, “text”=>”PHP的XML类测试!“ ); |
$insert=$xml->xml_query(‘update’,'title,=,20年后世界将会怎样?‘,’and’,$array);//title标签等于xxx的用$array替换(可以建唯一属性的标签,比如id,这样就可以修改某一条记录)
删除记录
代码如下 | 复制代码 |
require_once(‘xml.class.php’); $xml = new xml(“exemple.xml”,”item”); $array = array(); $insert=$xml->xml_query(‘update’,'title,=,20年后世界将会怎样?‘,’and’,$array);//数组留空 |
备注
删除时其实是把值变空,我们可以修改一下xml_update(),在生成xml文件之前先判断$array的值,如果值为空就不写入到最终的数组中就是删除的效果了。
写入xml文件时速度粉快(我测试过30000条记录的情况),插入时只插入一条记录,修改速度也相当的快,挺适合中型网站生成XML时使用,所以推荐一下。
php生成xml时添加CDATA标签方法非常的简单,因为是一个在xml中可以存储各种内容的标签了,下面整理了一个例子希望对各位有帮助。贴上代码留住伤疤,不要把<![CDATA[ $text]]>当成前后缀,其实它可以是标签。
代码如下 | 复制代码 |
<?php $dom = new DOMDocument("1.0"); |
公司网站是问答百科的网站、seo工程师提出需求说根据网站的问题来生成xml文件。每个xml文件包含5000条setmap格式数据。现在线上网站大约有70w条问题,所以说基本生成140个xml文件。还有一个索引文件。比如文件的名称以数字开头的。索引文件包含的内容就是每个xml文件的路径还有名称。
为什么要每个文件存储5000条数据呢,因为这是mysql的一个界限值、如果每次取多了以后可能会对线上用户访问造成影响,或者速度变慢。每个文件存储5000条数据,但是mysql selsect的时候不能每次取5000条、现在写的是每次取1000条。那这样逻辑就有点复杂。
先说一下实现:
首先取出1000条数据(可以灵活些成活的,方便以后修改),然后循环生成xml格式文件。file_puts_contens写入文件。然后再把生成的xml文件名称、取出问题的最小id、取出问题的最大id、取出问题的条数写出一个索引查询的txt文件当中,格式大概是这个样子的。
0,3146886,3145887,1000
发现最后面的条数是1000了吗、第一次select取出1000条数据、然后写入0.xml文件当中。把取出的xml文件名称、最小id、最大id、条数写入到索引查询txt中。第一次写入了1000条数据到0.xml、生成条数为1000。第二次查询的时候select语句会成为。 where id > 取出的最大id(当前mysql为正序查询、如果为倒序、改成小于) limit 1000 这样的话又取出1000、然后修改索引查询txt的最小id、最大id、生成条数加到2000。以此类推等生成条数到了5000的时候再另起一行写入索引文件、类似这样
0,3146886,3145887,5000
1,3148886,3147887,1000
这样写的话就减轻了服务器的压力。
下面贴出实现代码(风格有点乱):
代码如下 | 复制代码 |
<?php private static $askZonePcUrl = "http://www.xxx.cn/ask/jingxuan/"; //问答精选Pc链接 //读取索引文件 $start = '<?xml version="1.0" encoding="UTF-8" ?> '.chr(10); } |
sql代码不贴了、就一个select。
1、XML,Extensible Markup Language(可扩展标记语言),是一种可以创建自定义标记符号(Tags)的标记语言,是用于表示结构化信息的一种标准文本格式,作为下一代数据交换格式的标准。和HTML一样,XML基于标准通用标记语言(Standard Generalized Markup Language,SGML)。文档结构,层次非常清晰。xml文档只是存储了数据,是很有规律的结构化文档,但没有定义如何显示这些数据。文档结构可称为“文档树”,主干是顶层的父元素,分支和叶是子元素。
xml声明,表示文档遵循的是xml的1.0版的规范
2、xml特点:
可扩展性,xml允许使用者创建和使用他们自己的标记而不是HTML的有限标签,企业可以用XML为电子商务和供应链集成等应用定义自己的标记语言,甚至特定行业一起来定义该领域的特殊标记语言,作为该领域信息共享与数据交换的基础。不过,这些自定义标记仅仅是用来识别信息数据的,它本身并不传达信息。
灵活性,xml更像一个小型的数据库,提供了一种结构化的数据表示方式,使得用户界面分离于结构化数据。
自描述性,xml表示数据的方式真正做到了独立于应用系统,并且数据能够重用,xml文档被看作文档的数据库化和数据的文档化。
3、xml与html区别
html是一个定型的标记语言,它用固有的标记来描述,显示网页内容。xml没有固定的标记,不能描述网页具体的外观、内容,它只是描述内容的数据形式和结构。网页将数据和显示混在一起,而xml则将数据和显示分开。
xml文档注意事项
所有标记都必须有一个相应的结束标记、标记都必须合理嵌套、标记区分大小写、标记的属性必须用“”括起来。
标记命名规则:名字中可以包含字母、数字、下划线以及其他字母,不能以数字或下划线开头、名字不能以xml(或XML或Xml…)开头、名字中不能包含空格、名字中也不能使用“.”,“.”被用来连接元素和属性。
ps:支持汉字作为标记名,要注意编码。文件编码与xml声明的编码要一致
在 XML 中,有 5 个预定义的实体引用:
< < 小于
>> 大于
& & 和号
' ' 单引号
" " 双引号
XML文件生成操作简单示例
代码如下 | 复制代码 |
<?php |
相关文章
- 安装curl扩展支持https是非常的重要现在许多的网站都使用了https了,下面我们来看一篇关于PHP安装curl扩展支持https例子吧。 问题: 线上运行的lamp服务器,默认yu...2016-11-25
- 这篇文章主要介绍了jQuery读取XML文件的方法,结合实例形式分析了jQuery基于ajax针对xml文件的读取操作相关技巧,需要的朋友可以参考下...2017-02-08
- floor会产生小数了如果我们不希望有小数我们是可以去除小数点的了,下面一聚教程小编来为各位介绍php使用floor去掉小数点的例子,希望对各位有帮助。 float floor (...2016-11-25
- 下面我们来看一篇关于纯Css实现下拉菜单的简单例子,希望这篇文章能够给各位同学带来帮助,具体步骤如下. 大家可能会经常用到hover这属性,用hover实现鼠标经过的颜...2017-01-22
- 这篇文章主要介绍了Java解析xml文件遇到特殊符号&会出现异常的解决方案,实现思路很简单通过在读取xml文件使用SAX解析前读取reader,具体实现方法及示例代码跟随小编一起看看吧...2021-05-14
- $doc = new domdocument('1.0'); // we want a nice output $doc->formatoutput = true; 代码如下 复制代码 $root = $doc->createelement('bo...2016-11-25
- 在php中日期对比用得比较多了,还有一个日期加减也用到不少,下面我拿两个例子来给大家介绍在php中日期操作方法吧,希望文章能给你带来帮助 功能需求 文章发布时段操...2016-11-25
- 本例子不是读取Excel或生成新的Excel,而是读取现有的Excel文件,然后修改Excel中的数据,就像修改mysql中数据一样的哦。 代码如下 ...2016-11-25
- 正则提取图片中的地址我们介绍过很多的相关文章了,下面再来给各位介绍一个可以提取内容中第一张图片的例子,希望对各位有帮助。 代码如下 复制代码 ...2016-11-25
- 最近看到博客留言的头像有点别扭,因为游客的头像都是同一个头像,看着不是很舒服。虽然现在绝大多数的主题集成了Gavatar头像功能,先不说gavatar被墙的问题,我自己现在都没...2016-11-25
- php判断字符串是否包含另一个字符串的实现方法有许多的办法,像我们在网上一搜索可看到大量关于字符是否包含指定字符的方法,下面我把这些实用的例子整理一起与大家分享...2016-11-25
- date函数是php中一个非常好用的日期获取函数了,我们可以使用它来获取指定日期或者当前日期了,下面我来简单的介绍一下date函数用法与常用用法吧。 PHP星期几获取代...2016-11-25
- <?php $doc = new DOMDocument(); $doc->load( 'books.xml' ); $books = $doc->getElementsByTagName( "book" ); foreach( $books as $book ) { $authors =...2016-11-25
- 一般我们直接使用dom来处理xml文档时如果里面有中文就会把中文转换成乱码了,下面我们通过使用iconv()函数实现编码转换,防止中文乱码. 代码如下 复制代...2016-11-25
- 本篇文章是对在.net中使用XSLT转换xml文档的示例进行了详细的分析介绍,需要的朋友参考下...2021-09-22
- 对于cookie path很多的朋友不以为燃了这样会发现就是因为一个小点或一个路径问题测试了一天发现读取不了cookie值了,今天我就来给大家介绍cookie中路径的一些例子与注...2016-11-25
- <?php /** * Topic: Create and parse XML files using PHP DOM-XML * Source: http://www.php.net/domxml * Reference: http://www.zugeschaut-und-mitgebaut.d...2016-11-25
- 文件锁可以防止文件读写时多人访问时出现共享问题或数据不准确的问题,下面我们来看一篇关于php文件锁类防止并发的例子,具体如下. 工作间隙写了个文件锁的类,用于...2016-11-25
- 404状态代码在php中可以使用header输出但不能使用echo或print输出哦,许多的朋友把这个给搞混了,下面我们来看一篇关于php输出404状态码的例子 例子 代码如...2016-11-25
- Listing 4. simplemovie.mxml <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:VBox...2016-11-25