php对xml文件进行CURD操作

  XML是一种数据存储、交换、表达的标准:

    - 存储:优势在于半结构化,可以自定义schema,相比关系型二维表,不用遵循第一范式(可以有嵌套关系);

    - 交换:可以通过schema实现异构数据集成;

    - 表达:本身就可以作为阅读文档,当然还可以使用XSLT之类的进行解析和再显示。

    缺点是schema验证复杂,相比后来的json等格式,相对冗余。

 下面的是利用php对xml文件进行CURD操作:

xml文件的格式为:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <config>
 3     <dbmsg type="mysql">
 4         <host>127.0.0.1</host>
 5         <port>3306</port>
 6         <user>root</user>
 7         <password>root123</password>
 8         <db>ksuditest</db>
 9     </dbmsg>
10     <env>
11         <testenv>测试环境</testenv>
12         <projectenv>正式环境</projectenv>
13     </env>
14 </config>

1、用三种方法读取xml文件内容:

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: xxx
 5  * Date: 2016/11/28
 6  * Time: 9:36
 7  */
 8 // 使用三种方法来读取xml文件
 9 // 封装获取某一个节点,下面节点的value
10 function getNodeValue($nodeName,$tagName){
11     return $nodeName->getElementsByTagName($tagName)->item(0)->nodeValue;
12 }
13 
14 // ---------------第一种方法-----DOM------------------------
15 /*
16 $xmlDoc = new DOMDocument();
17 // 加载xml文件
18 $xmlDoc->load('config.xml');
19 // 获取dbmsg节点
20 $dbmsg = $xmlDoc->getElementsByTagName('dbmsg')->item(0);
21 // 打印db的相关信息
22 echo 'host-->'.getNodeValue($dbmsg,'host')."<br>";
23 echo 'port-->'.getNodeValue($dbmsg,'port')."<br>";
24 echo 'user-->'.getNodeValue($dbmsg,'user')."<br>";
25 echo 'password-->'.getNodeValue($dbmsg,'password')."<br>";
26 echo 'db-->'.getNodeValue($dbmsg,'db')."<br>";
27 */
28 
29 // ---------------第二种方法--------XPATH---------------------
30 /*
31 $xmlDoc = new DOMDocument();
32 // 加载xml文件
33 $xmlDoc->load('config.xml');
34 // 实例化一个DOMXPath对象
35 $xpath = new DOMXPath($xmlDoc);
36 // 获取dbmsg节点,使用xpath来查询
37 $dbmsg = $xpath->query('//dbmsg')->item(0);
38 // 打印db的相关信息
39 echo 'host-->'.getNodeValue($dbmsg,'host')."<br>";
40 echo 'port-->'.getNodeValue($dbmsg,'port')."<br>";
41 echo 'user-->'.getNodeValue($dbmsg,'user')."<br>";
42 echo 'password-->'.getNodeValue($dbmsg,'password')."<br>";
43 echo 'db-->'.getNodeValue($dbmsg,'db')."<br>";
44 */
45 // ---------------第三种方法--------SimpleXML---------------------
46 $sipleXml = simplexml_load_file('config.xml');
47 /*
48 echo 'db type==>'.$sipleXml->dbmsg['type']."<br>";
49 echo $sipleXml->dbmsg->host."<br>";
50 echo $sipleXml->dbmsg->port."<br>";
51 echo $sipleXml->dbmsg->user."<br>";
52 echo $sipleXml->dbmsg->password."<br>";
53 echo $sipleXml->dbmsg->db."<br>";
54 */
55 // siplexml配合xpath使用
56 $dbmsg = $sipleXml->xpath("//dbmsg")[0];
57 // 打印dbmsg的数据
58 // 打印dbmsg的属性
59 echo 'db type==>'.$dbmsg['type']."<br>";
60 // 打印
61 echo $dbmsg->host."<br>";
62 echo $dbmsg->port."<br>";
63 echo $dbmsg->user."<br>";
64 echo $dbmsg->password."<br>";
65 echo $dbmsg->db."<br>";

2、向xml文件中添加:

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: xxx
 5  * Date: 2016/11/28
 6  * Time: 11:12
 7  */
 8 $xmlDoc = new DOMDocument();
 9 $xmlDoc->load("config.xml");
10 // 根目录
11 $config = $xmlDoc->getElementsByTagName("config")->item(0);
12 // 创建testenv节点
13 $env = $xmlDoc->createElement("env");
14 
15 // 创建testenv
16 $testenv = $xmlDoc->createElement("testenv");
17 $testenv->nodeValue = '测试环境';
18 $env->appendChild($testenv);
19 
20 // 创建正式环境 projectenv
21 $projectenv = $xmlDoc->createElement("projectenv");
22 $projectenv->nodeValue = '正式环境';
23 $env->appendChild($projectenv);
24 
25 // 挂载env到config节点下
26 $config->appendChild($env);
27 // 保存xml文件
28 $xmlDoc->save('config.xml');
29 
30 echo "add message success!";

3、更新xml文件:

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: xxx
 5  * Date: 2016/11/28
 6  * Time: 10:56
 7  */
 8 // 更新xml节点的数据
 9 
10 $xmlDoc = new DOMDocument();
11 $xmlDoc->load("config.xml");
12 
13 // 修改密码
14 $xpath = new DOMXPath($xmlDoc);
15 $pwd = $xpath->query('//password')->item(0);
16 $pwd->nodeValue = 'root123';
17 
18 //save xml file
19 $xmlDoc->save("config.xml");
20 echo "update message success!";

4、对xml文件进行删除操作:

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: xxx
 5  * Date: 2016/11/28
 6  * Time: 13:54
 7  */
 8 // 删除xml中的节点
 9 $xmlDoc = new DOMDocument();
10 $xmlDoc->load("config.xml");
11 
12 // 删除最后一个env节点
13 $envs = $xmlDoc->getElementsByTagName('env');
14 // 找到最后一个env节点
15 $delenv = $envs->item($envs->length-1);
16 // 移除delenv节点
17 $delenv->parentNode->removeChild($delenv);
18 
19 // save xml file
20 $xmlDoc->save("config.xml");
21 echo 'delete success!';