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. [SQL] SQL SERVER基础语法

    Struct Query Language 1.3NF a.原子性 b.不能数据冗余 c.引用其他表的主键 2.约束 a.非空约束 b.主键约束 c.唯一约束 d.默认约束 e.检查约束 f.外键约束 ...

  2. Entity FrameWork 延迟加载的本质(一)

    1.集合的标准查询运算符方法,是来自于System.Linq.Enumerable里给IEnumerable接口添加的扩展方法 2.EF上下文里的DBSet<T>里的标准查询运算符方法,来 ...

  3. 20161119微信小程序初识

    Tritonal ft. Angel Taylor - Getaway [Official Lyric Video]

  4. 序列中找子序列的dp

    题目网址: http://codeforces.com/problemset/problem/414/B Description Mashmokh's boss, Bimokh, didn't lik ...

  5. 容器--Collection和AbstractCollection

    一.前言 容器是JAVA中比较重要的一块,整个体系设计得非常好,同时对于代码学习来说也是比较好的范例.同时很多面试官也比较喜欢用容器来考察面试者的基础知识,所以掌握好容器还是比较重要的.本文主要总结一 ...

  6. ThreadLocal解决线程安全问题

    一.线程安全问题产生的原因 线程安全问题都是由全局变量及静态变量引起的 二.线程安全问题 SimpleDateFormate sdf = new SimpleDateFormat();使用sdf.pa ...

  7. Python正则表达式模块(re模块)

    Python是我接触到的第一门编程语言,虽然它足够简单,但是对于当时刚刚接触编程语言的我来说还是有些难度的,于是只是了解了一些Python的基本语法,稍微深入一点的地方都没怎么了解.不过,到现在为止, ...

  8. python peewee.ImproperlyConfigured: MySQLdb or PyMySQL must be installed.

    最近在学习Python,打算先看两个在线教程,再在github上找几个开源的项目练习一下,在学到“被解放的姜戈”时遇到django同步数据库时无法执行的错误,记录一下. 错误现象: 执行python ...

  9. 成熟的RosettaNet解决方案软件介绍

    RosettaNet是一套B2B标准,以标准来优化供应链管理流程,它可以缩短整个供应链各个供货周期.RosettaNet 标准为电子商务标准化提供一个健壮的.非专有的解决方案,它是免费的,通过 Ros ...

  10. C# 生成中间含有LOGO的二维码

    效果如下: 1.无LOGO的二维码: 2.含有LOGO的二维码: 一.下载QrCode程序集: 使用的程序集有: 下载地址: http://zxingnet.codeplex.com/ 二.QRCod ...