高端技术PHP操作XML详解.docx
《高端技术PHP操作XML详解.docx》由会员分享,可在线阅读,更多相关《高端技术PHP操作XML详解.docx(26页珍藏版)》请在冰豆网上搜索。
高端技术PHP操作XML详解
[高端技术]PHP操作XML详解
XML是一种流行的半结构化文件格式,以一种类似数据库的格式存储数据。
在实际应用中,一些简单的、安全性较低的数据往往使用XML文件的格式进行存储。
这样做的好处一方面可以通过减少与数据库的交互性操作提高读取效率,另一方面可以有效利用XML的优越性降低程序的编写难度。
PHP提供了一整套的读取XML文件的方法,很容易的就可以编写基于XML的脚本程序。
本章将要介绍PHP与XML的操作方法,并对几个常用的XML类库做一些简要介绍。
1XML简介
XML是“可扩展性标识语言(eXtensibleMarkupLanguage)”的缩写,是一种类似于HTML的标记性语言。
但是与HTML不同,XML主要用于描述数据和存放数据,而HTML主要用于显示数据。
XML是一种“元标记”语言,开发者可以根据自己的需要创建标记的名称。
例如,下面的XML代码可以用来描述一条留言。
复制代码
1.
2.
Welcome3.Simon
4.WelcometoXMLguestbook!
!
5.
其中,与标签标记了这是一段留言。
在留言中有标题、作者、内容,完整的表述了一条留言信息。
在一个XML文件的顶部,通常使用
xmlversion=”1.0″?
>来标识XML数据的开始和XML数据使用标准的版本信息。
在浏览器中访问XML文件可以看到层次分明的XML数据信息,如图1所示。
XML的发展非常迅速,近些年来很多软件开发商都开始采用XML的开发标准进行应用程序的开发。
并且,很多新兴技术都架构在XML数据之上。
这意味着XML将与HTML一样成为Web技术不可或缺的一部分。
2简单的XML操作
在实际应用中,PHP与XML的交互操作应用非常广泛。
SimpleXML组件是PHP5新增加的一个简
单的XML操作组件,与传统的XML组件相比,SimpleXML组件的使用非常简单。
本节将对使用
SimpleXML组件操作XML的方法做一下详细介绍。
2.1创建一个SimpleXML对象
SimpleXML对象是用来临时存储XML数据的临时变量,对XML进行的操作都是通过操作SimpleXML对象来完成的。
SimpleXML组件提供了两种创建SimpleXML对象的方法。
第一种方法是使用simplexml_load_string函数读取一个字符串型变量中的XML数据来完成创建的,其语法格式如下所示。
simplexml_load_string(stringdata)
这里的data变量用于存储XML数据。
以下代码使用simplexml_load_string函数创建了一个SimpleXML对象
复制代码
1.
php
2.$data=<<3.
xmlversion=’1.0′?
>
4.
5.
6. productionsupport
7.
8.
9. 100001
10. Simon
11. 24
12. 1982-11-06
13. 5000.00
14. 1000.00
15.
16.
17. 100002
18. Elaine
19. 24
20. 1982-01-01
21. 6000.00
22. 2000.00
23.
24.
25.
26.
27. testingcenter
28.
29.
30. 110001
31. Helen
32. 23
33. 1983-07-21
34. 5000.00
35. 1000.00
36.
37.
38.
39.
40.XML;
41.$xml=simplexml_load_string($data);//创建SimpleXML对象
42.print_r($xml); //输出XML
43.?
>
在上面的例子中,$data变量存储了一段XML数据。
simplexml_load_string函数将变量$data转化成SimpleXML对象。
通过print_r函数的输出可以看出该对象的结构,运行结果如下所示。
复制代码
1.SimpleXMLElementObject
2.(
3. [depart]=>Array
4.(
5.
6. [0]=>SimpleXMLElementObject
7.(
8. [name]=>productionsupport
9. [employees]=>SimpleXMLElementObject
10.
11.( [employee]=>Array(
12. [0]=>SimpleXMLElementObject
13.( [serial_no]=>100001
14. [name]=>Simon
15. [age]=>24
16. [birthday]=>1982-11-06
17. [salary]=>5000.00
18. [bonus]=>1000.00
19.)
20. [1]=>SimpleXMLElementObject
21.( [serial_no]=>100002
22. [name]=>Elaine
23. [age]=>24
24. [birthday]=>1982-01-01
25. [salary]=>6000.00
26. [bonus]=>2000.00
27. )
28. )
29. )
30.)
31. [1]=>SimpleXMLElementObject
32.(
33. [name]=>testingcenter
34. [employees]=>SimpleXMLElementObject
35.(
36. [employee]=>SimpleXMLElementObject
37.(
38. [serial_no]=>110001
39. [name]=>Helen
40. [age]=>23
41. [birthday]=>1983-07-21
42. [salary]=>5000.00
43. [bonus]=>1000.00
44. )
45. )
46. )
47. )
48.)
从输出结果可以看出,SimpleXML对象的结构与XML数据的格式完全相同。
第二种方法是使用simplexml_load_flie函数读取一个XML文件来完成创建的,其语法格式如下所示。
simplexml_load_file(stringfilename)
这里的filename变量是用于存储XML数据文件的文件名及其所在路径。
以下代码使用simplexml_load_file函数来创建了一个SimpleXML对象。
复制代码
1.
php
2.$xml=simplexml_load_file(’example.xml’);//创建SimpleXML对象
3.print_r($xml); //输出XML
4.?
>
其中,example.xml存储的数据与上面的$data完全相同,运行结果也与上面完全相同。
上面两种方法实现了同样的功能,其区别就在于XML的数据源不同。
如果XML的数据源在PHP脚本文件中,则需要使用simplexml_load_string来进行创建。
如果XML的数据源在一个单独的XML文件中,则需要使用simplexml_load_file来进行创建。
2.2读取SimpleXML对象中的XML数据
前面介绍了使用print_r函数来读取SimpleXML对象中的数据,其返回结果与数组的结构类似。
显然,这种显示方式在实际应用中是不可取的。
在这里将介绍其他的几种读取SimpleXML对象中XML数据的方法。
1.var_dump函数显示对象详细信息
var_dump函数可以用于显示SimpleXML对象的详细信息,与print_r函数相比,var_dump函数显示的信息更为完整,其语法如下所示。
voidvar_dump(object1,object2…)
以下代码使用var_dump函数输出了上面例子中对象的详细信息。
复制代码
1.
php$xml=simplexml_load_file(’example.xml’);//创建SimpleXML对象var_dump($xml);//输出XML
2.?
>
运行结果如下所示。
复制代码
1.object(SimpleXMLElement)#1
(1){ ["depart"]=> array
(2){
2. [0]=>
3. object(SimpleXMLElement)#2
(2){
4. ["name"]=>
5. string(18)“productionsupport”
6. ["employees"]=>
7. object(SimpleXMLElement)#4
(1){
8.
9. ["employee"]=>
10. array
(2){
11. [0]=>
12. object(SimpleXMLElement)#5(6){
13.
14. ["serial_no"]=>
15. string(6)“100001″
16. ["name"]=>
17. string(5)“Simon”
18. ["age"]=>
19. string
(2)“24″
20. ["birthday"]=>
21. string(10)“1982-11-06″
22. ["salary"]=>
23. string(7)“5000.00″
24. ["bonus"]=>
25. string(7)“1000.00″
26.
27.}
28. [1]=>
29. object(SimpleXMLElement)#6(6){
30.
31. ["serial_no"]=>
32. string(6)“100002″
33. ["name"]=>
34. string(6)“Elaine”
35. ["age"]=>
36. string
(2)“24″
37. ["birthday"]=>
38. string(10)“1982-01-01″
39. ["salary"]=>
40. string(7)“6000.00″
41. ["bonus"]=>
42. string(7)“2000.00″
43.
44.}
45.}
46.}
47.}
48. [1]=>
49. object(SimpleXMLElement)#3
(2){
50.
51. ["name"]=>
52. string(14)“testingcenter”
53. ["employees"]=>
54. object(SimpleXMLElement)#7
(1){
55.
56. ["employee"]=>
57. object(SimpleXMLElement)#8(6){
58. ["serial_no"]=>
59. string(6)“110001″
60. ["name"]=>
61. string(5)“Helen”
62. ["age"]=>
63. string
(2)“23″
64. ["birthday"]=>
65. string(10)“1983-07-21″
66. ["salary"]=>
67. string(7)“5000.00″
68. ["bonus"]=>
69. string(7)“1000.00″
70.
71.}
72.}
73.}
74.}
75.}
与前面print_r输出的结果相比较,var_dump函数的输出结果的结构更为严谨,并且将对象中的每一个属性的数据类型均作出分析。
在实际应用中,var_dump函数往往用于程序调试时的对象检测。
2.读取XML数据中的标签
与操作数组类型的变量类似,读取XML也可以通过类似的方法来完成。
例如,如果需要读取上面XML数据中每一个“depart”标签下的“name”属性,可以通过使用foreach函数来完成,如以下代码
所示。
复制代码
1.
php$xml=simplexml_load_file(’example.xml’);foreach($xml->departas$a)
2.{
3.echo“$a->name
”;
4.}
5.?
>
运行结果如下所示。
productionsupport
testingcenter
//读取XML文件//循环读取XML数据中的每一个depart标签
//输出其中的name属性
也可以使用方括号“[]”来直接读取XML数据中指定的标签。
以下代码输出了上面XML数据中的第一个“depart”标签的“name”属性。
复制代码
1.
php
2.$xml=simplexml_load_file(’example.xml’);//读取XML文件
3.echo$xml->depart->name[0];//输出节点
4.?
>
运行结果如下所示。
productionsupport
对于一个标签下的所有子标签,SimpleXML组件提供了children方法进行读取。
例如,对于上面的XML数据中的“depart”标签,其下包括两个子标签:
“name”和“employees”。
以下代码实现了对第一个“depart”标签下的子标签的读取。
复制代码
1.
php
2.$xml=simplexml_load_file(’example.xml’);
3.foreach($xml->depart->children()as$depart)//循环读取depart标签下的子标签
4.{
5.var_dump($depart);//输出标签的XML数据
6.}
7.?
>
运行结果如下所示。
复制代码
1.object(SimpleXMLElement)#3
(1){
2.[0]=>
3. string(18)“productionsupport”
4.}
5.object(SimpleXMLElement)#5
(1){
6. ["employee"]=>
7. array
(2){
8. [0]=>
9. object(SimpleXMLElement)#3(6){
10. ["serial_no"]=>
11. string(6)“100001″
12. ["name"]=>
13. string(5)“Simon”
14. ["age"]=>
15. string
(2)“24″
16. ["birthday"]=>
17. string(10)“1982-11-06″
18. ["salary"]=>
19. string(7)“5000.00″
20. ["bonus"]=>
21. string(7)“1000.00″
22.
23.}
24. [1]=>
25. object(SimpleXMLElement)#6(6){
26. ["serial_no"]=>
27. string(6)“100002″
28. ["name"]=>
29. string(6)“Elaine”
30. ["age"]=>
31. string
(2)“24″
32. ["birthday"]=>
33. string