php操作xml类读取查询删除数据(支持三级节点)

 更新时间:2016年11月25日 16:54  点击:1523
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文档的类或插件是非常的多了,今天我来为各位介绍xmlreader simplexmlDOMDocument 等读取xml的例子,希望下文能帮助到大家。

要处理 XML 文件,有两种传统的处理思路: SAX 和 DOM 。 SAX 基于事件触发机制,对 XML 文件进行一次扫描,完成要进行的处理; DOM 则将整个 XML 文件构造为一棵 DOM树,通过对 DOM 树的遍历完成处理。这两种方法各有优缺点, SAX 的处理思路相对抽象,DOM 的处理过程相对烦琐,都不很适合新手的入门。PHP5 推出了一套新的 XML 处理函数,即 SimpleXML 。名如其实, SimpleXML 本身小巧精干,只提供了少量的几个方法函数,但用它处理起 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"?> 
  <humans> 
  <zhangying> 
  <name>张映</name> 
  <sex>男</sex> 
  <old>28</old> 
  </zhangying> 
  <tank> 
  <name>tank</name> 
  <sex>男</sex> 
  <old>28</old> 
  </tank> 
  </humans> 

1)DOMDocument读取xml
 

 代码如下 复制代码
  <?php 
  $doc = new DOMDocument(); 
  $doc->load('person.xml');         //读取xml文件 
   
  $humans = $doc->getElementsByTagName( "humans" );         //取得humans标签的对象数组 
 
  foreach( $humans as $human ) 
  { 
  $names = $human->getElementsByTagName( "name" );           //取得name的标签的对象数组 
  $name = $names->item(0)->nodeValue;                                        //取得node中的值,如<name> </name> 
   
  $sexs = $human->getElementsByTagName( "sex" ); 
  $sex = $sexs->item(0)->nodeValue; 
  
  $olds = $human->getElementsByTagName( "old" ); 
  $old = $olds->item(0)->nodeValue; 
  
  echo "$name - $sex - $old\n"; 
  
  } 
  ?> 

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>";    

 
?> 

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++; 
 } 

?> 


 

使用 DOMDocument 操控 XML

1. DOMDocument 解析 XML

 代码如下 复制代码

// 创建一个 DOMDocument()

$_doc = new DOMDocument();

// 载入 xml

$_doc ->load( 'test.xml' );

// 取 version 标签

$_version = $_doc ->getElementsByTagName( 'version' );

echo $_version ->item( 2 )->nodeValue;

// 遍历 version 标签

foreach ( $_version as $v ) {

echo $v ->nodeValue;

}

2. DOMDocument 生成 XML

// 声明 xml

$_doc = new DOMDocument( '1.0' , 'utf-8' );

// 排版格式

$_doc ->formatOutput = true ;

// 创建一个主标签

$_root = $_doc ->createElement( 'root' );

// 创建一个一级标签 version

$_version = $_doc ->createElement( 'version' );

// 给 version 标签里赋值

$_versionTextNode = $_doc ->createTextNode( '1.0' );

// 将值放入 version 标签里

$_version ->appendChild( $_versionTextNode );

// 将一级标签 version 放入 root 里

$_root ->appendChild( $_version );

// 将主标签写入 xml

$_doc ->appendChild( $_root );

// 生成 xml

$_doc ->save( 'aaa.xml' );


很多情况下 , 手工生成标记要求从上到下生成文档 , 必须保证标签都是完整的 , 开始和结束标签。尽管借助于一些 PHP 函数或类可以有所改善,不过 PHP 还提供了一组更有帮助的内置对象和函数。文档对象模型( Document Object Model , DOM )提供了一个树状结构,能很容易创建和处理标签。

三,小结

读取xml的方法很多,简单举几个。上面四种方法都是可以把标签中的数据读出来,<name>张映</name>.但是他们的测重点不同,前三种方法的读取xml的function的设计重点,是为了读取标签中的值,相当于jquery中的text()方法,而xmlreader呢他就不太一样,他的重点不在读取标签中的值,而读取标签的属性,把要传送的数据,都放在属性中(不过我上面写的那个方法还是取标签中的值,因为xml文件已经给定了,我就不想在搞xml文件出来了)。举个例子解释一下,
<data name='张映'  sex='男' old='28'></data>
xmlreader的设计重点是为了读data里面的name sex old的值,而读取<data></data>的内容就比较麻烦了。他相当于jquery中attr('');这个东西。

PHP如何读取xml文件?有不少朋友不知道这个问题,其实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"?>
<humans>
<zhangying>
<name>张映</name>
<sex>男</sex>
<old>28</old>
</zhangying>
<tank>
<name>tank</name>
<sex>男</sex>
<old>28</old>
</tank>
</humans>
1)DOMDocument读取xml
<?php
$doc = new DOMDocument();
$doc->load('person.xml'); //读取xml文件
$humans = $doc->getElementsByTagName( "humans" ); //取得humans标签的对象数组
foreach( $humans as $human )
{
$names = $human->getElementsByTagName( "name" ); //取得name的标签的对象数组
$name = $names->item(0)->nodeValue; //取得node中的值,如<name> </name>
$sexs = $human->getElementsByTagName( "sex" );
$sex = $sexs->item(0)->nodeValue;
$olds = $human->getElementsByTagName( "old" );
$old = $olds->item(0)->nodeValue;
echo "$name - $sex - $old\n";
}
?>

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时添加CDATA标签方法非常的简单,因为是一个在xml中可以存储各种内容的标签了,下面整理了一个例子希望对各位有帮助。

贴上代码留住伤疤,不要把<![CDATA[ $text]]>当成前后缀,其实它可以是标签。

 

 代码如下 复制代码

<?php

$dom = new DOMDocument("1.0");
// display document in browser as plain text
// for readability purposes
header("Content-Type: text/plain");
// create root element
$root = $dom->createElement("toppings");
$dom->appendChild($root);
// create child element
$item = $dom->createElement("item");
$root->appendChild($item);
// create text node
$text = $dom->createTextNode("pepperoni");
$item->appendChild($text);
// create attribute node
$price = $dom->createAttribute("price");
$item->appendChild($price);
// create attribute value node
$priceValue = $dom->createTextNode("4");
$price->appendChild($priceValue);
// create CDATA section
$cdata = $dom->createCDATASection(" Customer requests that pizza be sliced into 16 square pieces ");
$root->appendChild($cdata);
// create PI
$pi = $dom->createProcessingInstruction("pizza", "bake()");
$root->appendChild($pi);
// save and display tree
echo $dom->saveXML();
?>

百度站点地图是百度工具中一个非常实用的功能了可以实时的让我们的网站给百度定时抓取了,下面我们一起来看看由php生成的一个xml文档了哦。


公司网站是问答百科的网站、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
/*
 * SiteMap接口类
 */
 
class SitemapAction extends Action{
private static $baseURL = ''; //URL地址
private static $askMobileUrl = 'http://m.xxx.cn/ask/'; //问答移动版地址
private static $askPcUrl = "http://www.xxx.cn/ask/";   //问答pc地址

private static $askZonePcUrl = "http://www.xxx.cn/ask/jingxuan/"; //问答精选Pc链接
private static $askZoneMobileUrl = "http://m.xxx.cn/ask/jx/"; //问答精选移动版链接
        //问答setmaps
public function askSetMap(){
header('Content-type:text/html;charset=utf-8');
//获取问题列表
$maxid = 0;    //索引文件最大id
$minid = 0;    //索引文件最小id
$psize = 1000; //数据库每次取数量
$maxXml = 5000; //xml写入记录数量
$where = array();

//读取索引文件
$index = APP_PATH.'setmapxml/Index.txt';
//关联setmaps路径
$askXml = "../siteditu/ask/ask.xml";
if(!file_exists($index)){
$fp=fopen("$index", "w+");
if ( !is_writable($index) ){
die("文件:" .$index. "不可写,请检查!");
}
fclose($fp);
}else{
//index.txt文件说明 0:xml文件名称(从1开始)、1:文件最大id、2:文件最小id、3:文件当前记录数
$fp = file($index);
$string = $fp[count($fp)-1];//显示最后一行
$arr = explode(',', $string);
}
//索引文件数量是否小于$maxXml
//如果为第一次运行
if(!$arr[1]){
$bs=1;
$filename=0;
}else{
if($arr && $arr[3]<$maxXml){
$filename = $arr[0];
$psize = $maxXml-$arr[3]>$psize?$psize:($maxXml-$arr[3]);
$bs = 0;
}else{
$filename = $arr[0]+1;
$bs=1;
}
}
$maxid = empty($arr[1])?0:$arr[1];
$minid = empty($arr[2])?0:$arr[2];
echo "文件名称:".$filename.".xml"."<br/ >";
echo "最大id:".$maxid."<br />";
echo "最小id:".$minid."<br />";
echo "xml写入最大记录:".$maxXml."<br />";
echo "数据库每次读取数量:".$psize."<br />";
$list = self::$questionObj->getQuestionSetMap($where,$maxid,$psize);
if(count($list)<=0){
echo 1;exit;
}
$record = $arr[3]+count($list); //索引文件写入记录数
$indexArr = array('filename'=>$filename,'maxid'=>$maxid,'minid'=>$minid,'maxXml'=>$record);

$start = '<?xml version="1.0" encoding="UTF-8" ?> '.chr(10);
$start.="<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:mobile=\"http://www.baidu.com/schemas/sitemap-mobile/1/\">".chr(10);
                                $start.="</urlset>";
foreach($list as $k=>$qinfo){
if($k==0)
$indexArr['minid']=$qinfo['id'];
$qinfo['lastmod'] = substr($qinfo['lasttime'],0,10);
$qinfo['mobielurl'] = self::$askMobileUrl.$qinfo['id'].'.html'; //移动版链接
$qinfo['pcurl'] = self::$askPcUrl.$qinfo['id'].'-p1.html'; //pc版链接
$xml.=$this->askMapMobileUrl($qinfo); //移动版
$xml.=$this->askMapPcUrl($qinfo);     //pc版
}
$maxid = end($list);
$indexArr['maxid'] = $maxid['id'];
//更新索引文件
if($bs==0){
//更新最后一行
$txt = file($index);
$txt[count($txt)-1] = $indexArr[filename].','.$indexArr[maxid].','.$indexArr['minid'].','.$indexArr['maxXml']."\r\n";
$str = join($txt);
if (is_writable($index)) {
if (!$handle = fopen($index, 'w')) {
echo "不能打开文件 $index";exit;
exit;
}
if (fwrite($handle, $str) === FALSE) {
echo "不能写入到文件 $index";exit;
exit;
}
echo "成功地写入文件$index";
fclose($handle);
} else {
echo "文件 $index 不可写";exit;
}
fclose($index);
}elseif($bs==1){
//新加入一行
$fp = fopen($index,'a');
$num = count($list);
$string = $indexArr[filename].','.$indexArr[maxid].','.$indexArr['minid'].','.$num."\r\n";
if(fwrite($fp,$string)===false){
echo "追加新行失败。。。";exit;
}else{
echo "追加成功<br />";
//更新sitemap索引文件
$xmlData="<?xml version=\"1.0\"  encoding=\"UTF-8\" ?>".chr(10);
$xmlData.="<sitemapindex>".chr(10);
$xmlData.="</sitemapindex>";
if(!file_exists($askXml))
file_put_contents($askXml,$xmlData);
$fileList = file($askXml);
$fileCount = count($fileList);
$setmapxml = "http://www.xxx.cn/ask/setmapxml/{$filename}.xml";//正常问题链接
$txt = $this->setMapIndex($setmapxml);
$fileList[$fileCount-1]=$txt."</sitemapindex>";
$newContent = '';
foreach($fileList as $v){
$newContent.= $v;
}
if(!file_put_contents($askXml,$newContent)) exit('无法写入数据');
echo '已经写入文档' . $askXml;
}
fclose($fp);
}
$filename =  APP_PATH.'setmapxml/'.$filename.'.xml';
                //更新到xml文件中,增加结尾
                if(!file_exists($filename))
                        file_put_contents($filename,$start);
                $xmlList = file($filename);
                $xmlCount = count($fileList);
                $xmlList[$xmlCount-1]=$xml."</urlset>";
                $newXml = '';
foreach($xmlList as $v){
$newXml.= $v;
}
if(!file_put_contents($filename, $newXml))exit("写入数据错误");
                else
                    echo "写入数据成功<br />";
}
//问答移动版xml
private function askMapMobileUrl($data){
$xml = '';
if(is_array($data)&&!empty($data)){
$xml .="<url>".chr(10);
if($data['id'])
$xml.='<loc>'.$data['mobielurl'].'</loc>'.chr(10);//移动版链接
$xml.="<mobile:mobile type=\"mobile\"/>".chr(10);
if($data['lastmod'])
$xml.='<lastmod>'.$data['lastmod'].'</lastmod>'.chr(10);
$xml.='<changefreq>daily</changefreq>'.chr(10);
$xml.='<priority>0.8</priority>'.chr(10);  
$xml.="</url>".chr(10);
return $xml;
}
}
//问答pc版xml
private function askMapPcUrl($data){
$xml = '';
if(is_array($data)&&!empty($data)){
$xml.='<url>'.chr(10);
if($data['id'])
$xml.='<loc>'.$data['pcurl'].'</loc>'.chr(10);//pc版链接
if($data['lastmod'])
$xml.='<lastmod>'.$data['lastmod'].'</lastmod>'.chr(10);
$xml.='<changefreq>daily</changefreq>'.chr(10);
$xml.='<priority>0.8</priority>'.chr(10);
$xml.='</url>'.chr(10);
return $xml;
}
}
//setmaps索引文件
private function setMapIndex($filename){
$xml = '';
$xml.="<sitemap>".chr(10);
$xml.="<loc>{$filename}</loc>".chr(10);
$xml.="<lastmod>".date("Y-m-d",time())."</lastmod>".chr(10);
$xml.="</sitemap>".chr(10);
return $xml;
}

}
?>
 
 
 
 
xml索引文件格式
<?xml version="1.0"  encoding="UTF-8" ?>
<sitemapindex>
<sitemap>
<loc>http://www.xxx.cn/ask/setmapxml/0.xml</loc>
<lastmod>2014-05-12</lastmod>
</sitemap>
<sitemap>
<loc>http://www.xxx.cn/ask/setmapxml/1.xml</loc>
<lastmod>2014-05-12</lastmod>
</sitemap>
</sitemapindex>
 
xml文件格式(每个文件需要存储5000条、现展示1条例子)
<?xml version="1.0" encoding="UTF-8" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/">
<url>
<loc>http://m.xxx.cn/ask/7460.html</loc>
<mobile:mobile type="mobile"/>
<lastmod>2013-01-11</lastmod>
<changefreq>daily</changefreq>
<priority>0.8</priority>
</url>
<url>
</urlset>


 
 
sql代码不贴了、就一个select。

[!--infotagslink--]

相关文章

  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • Mybatis Plus select 实现只查询部分字段

    这篇文章主要介绍了Mybatis Plus select 实现只查询部分字段的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-01
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • 删除条目时弹出的确认对话框

    复制代码 代码如下: <td> <a href="/member/life/edit_ppt/<?php echo $v->id;?>" class="btn">编辑</a> <a href="javascript:;" onclick="if(confirm('您确定删除这条记录?')){location.href='/member/life/d...2014-06-07
  • php把读取xml 文档并转换成json数据代码

    在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
  • MyBatisPlus-QueryWrapper多条件查询及修改方式

    这篇文章主要介绍了MyBatisPlus-QueryWrapper多条件查询及修改方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2022-06-27
  • Oracle使用like查询时对下划线的处理方法

    这篇文章主要介绍了Oracle使用like查询时对下划线的处理方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-16
  • jQuery动态添加与删除tr行实例代码

    最近由于项目的需要,需要动态的添加和删除table中的tr,感觉用JS可以实现,但是在网上找了一下,单纯的自己写JS,感觉太麻烦,而且也不好维护。于是想到了最近学的jQuery。这篇文章给大家用实例介绍了jQuery动态添加与删除tr行的方法,有需要的朋友们可以参考借鉴。...2016-10-20
  • 解决mybatis-plus 查询耗时慢的问题

    这篇文章主要介绍了解决mybatis-plus 查询耗时慢的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-04
  • php跨网站请求伪造与防止伪造方法

    伪造跨站请求介绍伪造跨站请求比较难以防范,而且危害巨大,攻击者可以通过这种方式恶作剧,发spam信息,删除数据等等。...2013-10-01
  • Centos中彻底删除Mysql(rpm、yum安装的情况)

    我用的centos6,mysql让我整出了各种问题,我想重装一个全新的mysql,yum remove mysql-server mysql之后再install并不能得到一个干净的mysql,原来的/etc/my.cnf依然没变,datadir里面的数据已没有任何变化,手动删除/etc/my.cn...2015-03-15
  • MyBatis-Plus的物理删除和逻辑删除(使用场景)

    数据库中的数据删除会分为两种:物理删除 和 逻辑删除,接下来通过本文给大家介绍MyBatis-Plus的物理删除和逻辑删除使用场景分析,感兴趣的朋友一起看看吧...2021-09-25
  • c# 对CSV文件操作(写入、读取、修改)

    这篇文章主要介绍了c# 如何对CSV文件操作,帮助大家更好的理解和学习C#,感兴趣的朋友可以了解下...2020-11-03
  • python读取和保存mat文件的方法

    本文主要介绍了python读取和保存mat文件的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-25
  • MySQL中在查询结果集中得到记录行号的方法

    如果需要在查询语句返回的列中包含一列表示该条记录在整个结果集中的行号, ISO SQL:2003 标准提出的方法是提供 ROW_NUMBER() / RANK() 函数。 Oracle 中可以使用标准方法(8i版本以上),也可以使用非标准的 ROWNUM ; MS SQL...2015-03-15
  • Node实现搜索框进行模糊查询

    这篇文章主要为大家详细介绍了Node实现搜索框进行模糊查询,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-06-28
  • js实现上传文件添加和删除文件选择框

    这篇文章主要为大家详细介绍了js实现上传文件添加和删除文件选择框 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-25
  • Element-ui 自带的两种远程搜索(模糊查询)用法讲解

    这篇文章主要介绍了Element-ui 自带的两种远程搜索(模糊查询)用法讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-29
  • mybatis-plus getOne和逻辑删除问题详解

    这篇文章主要介绍了mybatis-plus getOne和逻辑删除,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-26
  • Android中使用SDcard进行文件的读取方法

    首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!--...2016-09-20