PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写、DOMDocument读写、

XMLWrite写和XMLReader读、SimpleXML读写,本文将依次对这四种方法进行介绍。

  介绍之前首先对本文例子使用的数据和文件进行说明。本文写XML文件的例子都是从MySQL中读取数据然后

写入到XML文件中,读XML文件的例子都是从XML文件中读取数据后组装成数组的格式,数组中每个元素对应数

据库中的一条记录。

MySQL中的数据:

XML文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="utf8"?>
<studentcareer>
  <period>
    <starttime>2000</starttime>
    <endtime>2002</endtime>
    <school>培新小学</school>
  </period>
  <period>
    <starttime>2002</starttime>
    <endtime>2006</endtime>
    <school>览表东阳学校</school>
  </period>
  <period>
    <starttime>2006</starttime>
    <endtime>2009</endtime>
    <school>惠来慈云实验中学</school>
  </period>
  <period>
    <starttime>2009</starttime>
    <endtime>2012</endtime>
    <school>惠来一中</school>
  </period>
  <period>
    <starttime>2012</starttime>
    <endtime>2016</endtime>
    <school>华南师范大学</school>
  </period>
</studentcareer>

读取XML文件后组装成的数据格式:

下面的例子使用的数据、文件都是以上所列数据、文件,介绍各个方法时不再赘述,直接贴代码。

一、PHP字符串方式读写XML文件:

1. 字符串方式写XML文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
/**
* function:使用字符串方式写XML文件
* author:JetWu
* date:2016.12.03
**/
$mysqli = mysqli_connect('localhost''root''123456''wjt');
if(mysqli_connect_errno()) die('database connect fail:' . mysqli_connect_error());
 
$sql 'select * from study order by starttime';
$res = mysqli_query($mysqli$sql);
$study array();
while($row = mysqli_fetch_array($res)) {
    $study[] = $row;
}
//XML标签配置
$xmlTag array(
    'starttime',
    'endtime',
    'school'
);
 
$str "<studentcareer>\n";
foreach($study as $v) {
    $str .= "\t<period>\n";
    foreach($xmlTag as $x) {
        $str .= "\t\t<".$x.">" $v[$x] . "</".$x.">\n";
    }
    $str .= "\t</period>\n";
}
$str .= '</studentcareer>';
 
$file './write_str.xml';
file_put_contents($file$str);

2. 字符串方式读XML文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
/**
* function:使用字符串方式读XML文件
* author:JetWu
* date:2016.12.03
**/
$file './write_str.xml';
$con file_get_contents($file);
 
//XML标签配置
$xmlTag array(
    'starttime',
    'endtime',
    'school'
);
 
$arr array();
foreach($xmlTag as $x) {
    preg_match_all("/<".$x.">.*<\/".$x.">/"$con$temp);
    $arr[] = $temp[0];
}
//去除XML标签并组装数据
$data array();
foreach($arr as $key => $value) {
    foreach($value as $k => $v) {
        $a explode($xmlTag[$key].'>'$v);
        $v substr($a[1], 0, strlen($a[1])-2);
        $data[$k][$xmlTag[$key]] = $v;
    }
}
echo '<pre>';
print_r($data);

二、DOMDocument读写XML文件

1. DOMDocument写XML文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
/**
* function:DOMDocument写XML文件
* author:JetWu
* date:2016.12.03
**/
$mysqli = mysqli_connect('localhost''root''123456''wjt');
if(mysqli_connect_errno()) die('database connect fail:' . mysqli_connect_error());
 
$sql 'select * from study order by starttime';
$res = mysqli_query($mysqli$sql);
$study array();
while($row = mysqli_fetch_array($res)) {
    $study[] = $row;
}
//XML标签配置
$xmlTag array(
    'starttime',
    'endtime',
    'school'
);
 
$dom new DOMDocument('1.0''utf8');
$dom->formatOutput = true;
$studentcareer $dom->createElement('studentcareer');
$dom->appendChild($studentcareer);
foreach($study as $s) {
    $period $dom->createElement('period');
    $studentcareer->appendChild($period);
    foreach($xmlTag as $x) {
        $element $dom->createElement($x);
        $period->appendChild($element);
        $text $dom->createTextNode($s[$x]);
        $element->appendChild($text);
    }
}
$dom->save('./write_dom.xml');

2. DOMDocument读XML文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
/**
* function:DOMDocument读XML文件
* author:JetWu
* date:2016.12.03
**/
//XML标签配置
$xmlTag array(
    'starttime',
    'endtime',
    'school'
);
$dom new DOMDocument();
$dom->load('./write_dom.xml');
$periods $dom->getElementsByTagName('period');
$study array();
foreach($periods as $k => $p) {
    foreach($xmlTag as $x) {
        $node $p->getElementsByTagName($x);
        $study[$k][$x] = $node->item(0)->nodeValue;
    }
}
echo '<pre>';
print_r($study);

三、XMLWriter和XMLReader读写XML文件

1. XMLWriter写XML文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
/**
* function:XMLWriter写XML文件
* author:JetWu
* date:2016.12.03
**/
$mysqli = mysqli_connect('localhost''root''123456''wjt');
if(mysqli_connect_errno()) die('database connect fail:' . mysqli_connect_error());
 
$sql 'select * from study order by starttime';
$res = mysqli_query($mysqli$sql);
$study array();
while($row = mysqli_fetch_array($res)) {
    $study[] = $row;
}
 
//XML标签配置
$xmlTag array(
    'starttime',
    'endtime',
    'school'
);
 
$xml new XMLWriter();
$xml->openUri('./write_WR.xml');
$xml->setIndentString('  ');//设置缩进格式化使用的符号
$xml->setIndent(true);
$xml->startDocument('1.0''utf8');
$xml->startElement('studentcareer');
foreach($study as $s) {
    $xml->startElement('period');
    foreach($xmlTag as $x) {
        $xml->startElement($x);
        $xml->text($s[$x]);
        $xml->endElement();
    }
    $xml->endElement();
}
$xml->endElement();
$xml->endDocument();
$xml->flush();

2. XMLReader读XML文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
/**
* function:XMLReader读XML文件
* author:JetWu
* date:2016.12.03
**/
//XML标签配置
$xmlTag array(
    'starttime',
    'endtime',
    'school'
);
$xml new XMLReader();
$xml->open('./write_WR.xml');
$study array();
$count = 0;//记录数:方便组装数据
$name '';
while($xml->read()) {
    $n $xml->name;
    if($xml->nodeType == XMLReader::ELEMENT) {
        if($n == 'period') {//开始下一条记录的读取
            $count ++;
        else if(in_array($n$xmlTag)) {//记录需要获取文本值的标签名
            $name $n;
        }
    else if($xml->nodeType == XMLReader::TEXT) {
        if(in_array($name$xmlTag)) {
            $study[$count][$name] = $xml->value;
        }
    }
}
$xml->close();
echo '<pre>';
print_r($study);

四、SimpleXML读写XML文件

1. SimpleXML写XML文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
/**
* function:SimpleXML写XML文件
* author:JetWu
* date:2016.12.03
**/
$mysqli = mysqli_connect('localhost''root''123456''wjt');
if(mysqli_connect_errno()) die('database connect fail:' . mysqli_connect_error());
 
$sql 'select * from study order by starttime';
$res = mysqli_query($mysqli$sql);
$study array();
while($row = mysqli_fetch_array($res)) {
    $study[] = $row;
}
 
//XML标签配置
$xmlTag array(
    'starttime',
    'endtime',
    'school'
);
$xml new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><studentcareer />');
foreach($study as $s) {
    $period $xml->addChild('period');
    foreach($xmlTag as $x) {
        $period->addChild($x$s[$x]);
    }
}
$xml->asXml('./write_sim.xml');//输出XML文件(没有格式化)

2. SimpleXML读XML文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
/**
* function:SimpleXML读XML文件
* author:JetWu
* date:2016.12.03
**/
//XML标签配置
$xmlTag array(
    'starttime',
    'endtime',
    'school'
);
$study array();
$xml = simplexml_load_file('./write_sim.xml');
foreach($xml->children() as $period) {
    $study[] = get_object_vars($period);//获取对象全部属性,返回数组
}
echo '<pre>';
print_r($study);

  总结:这四种方法中,字符串的方式是最原始的方法。SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储

为树的数据结构中,需要把整个文档都加载到内存中才能工作,所以当处理大型XML文档的时候,性能会剧减。XMLReader

则是属于基于流的解析器,它不会一次把整个文档加载到内存中,而是每次分别读取其中的一个节点并允许实时与之交互,这种

方式效率高,而且占内存少。

PHP读写XML文件的四种方法的更多相关文章

  1. PHP怎么读写XML?(四种方法)

    PHP怎么读写XML?(四种方法) 一.总结 1.这四种方法中,字符串的方式是最原始的方法.SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储为树的数据结构中,需要把整个文档都加载到内 ...

  2. 精----Java读取xml文件的四种方法

    xml文件: Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VA ...

  3. java读取xml文件的四种方法

    Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> ...

  4. java读取XML文件的四种方式

    java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...

  5. [转载]C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...

  6. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  7. C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...

  8. C#读写txt文件的两种方法介绍[转]

    C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...

  9. C#读写txt文件的两种方法介绍 v

    C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...

随机推荐

  1. MySQL安全问题(防范必知)

    对于任何一种数据库来说,安全问题都是非常重要的.如果数据库出现安全漏洞,轻则数据被窃取,重则数据被破坏,这些后果对于一些重要的数据库都是非常严重的.下面来从操作系统和数据库两个层对MySQL的安全问题 ...

  2. HT for Web中3D流动效果的实现与应用

    流动效果在3D领域有着广泛的应用场景,如上图中医学领域可通过3D的流动直观的观察人体血液的流动,燃气领域可用于监控管道内流动的液体或气体的流向.流速和温度等指标. 如今企业数据中心机房普遍面临着设备散 ...

  3. [Architect] Abp 框架原理解析(3) DynamicFilters

    本节目录 介绍 定义Filter 设置Filter 这是Abp中多租户.软删除.激活\禁用等如此方便的原因 Install-Package EntityFramework.DynamicFilters ...

  4. Spring基础——在 IOC 容器中 Bean 之间的关系

    一.在 Spring IOC 容器中 Bean 之间存在继承和依赖关系. 需要注意的是,这个继承和依赖指的是 bean 的配置之间的关系,而不是指实际意义上类与类之间的继承与依赖,它们不是一个概念. ...

  5. github生成燃尽图

    一.     前期准备工作. 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8添加标签 二.     修改进度 2.1进入milestone,编辑 可以看到上面有bug标签,进入并解决 ...

  6. maven异常解决:编码GBK的不可映射字符

    直接将项目改为UTF-8编码,无效!要通过修改pom.xml文件,告诉maven这个项目使用UTF-8来编译. 一.问题描述 今天在MyEclipse中使用Maven编译项目源代码时,结果如下了如下的 ...

  7. 可拖动FPS显示框(UGUI)

    简介 本来是想往上找一个可拖动FPS显示框的(我记得以前有人写过),然而搜了一个多小时都没搜到,索性自己写了一个,花费不到20分钟,看来还是自己动手丰衣足食啊 o(╯□╰)o 效果 上下的Toast不 ...

  8. javascript类的理解和使用

    距离上次写博客已经过去好几个月了,现在手里的项目正好都结束了,闲暇之后开始理一下开发中一些问题,这次说一下javascript当中的类,可能很多人对于写惯了前台页面效果的coder来说,对于javas ...

  9. 10个出色的NoSQL数据库

    http://www.infoq.com/research/nosql-databases?utm_source=infoqresearch&utm_campaign=lr-homepage ...

  10. sql2008 查询字段所属表

    select a.name as 表名, g.*from sysobjects as a left join syscolumns as b on a.id=b.id left JOIN sys.ex ...