XML是一种流行的半结构化文件格式,它以类似于数据库的格式存储数据。在实践中,一些简单且安全性低的数据往往以XML文件格式存储。一方面,通过减少与数据库的交互操作,可以提高阅读效率;另一方面可以有效利用XML的优势,降低编程难度。PHP提供了一套完整的读取XML文件的方法,基于XML编写脚本很容易。本章将介绍PHP和XML的操作方法,并简单介绍几种常用的XML类库。XML简介XML是“可扩展标记语言”的缩写,是一种类似于HTML的标记语言。但与HTML不同的是,XML主要用于描述和存储数据,而HTML主要用于显示数据。XML是一种“元标签”语言,开发人员可以根据自己的需要创建标签名。例如,下面的XML代码可以用来描述一条消息。复制的代码如下:线程标题欢迎/标题作者Simon/作者内容欢迎来到XML客书!/content /thread,其中thread和/thread标记将此标记为消息。消息中有标题,有作者,有内容,完整的表达了一条消息。在XML文件的顶部,您通常使用?xml版本=“1.0”?标识XML数据的开头,并使用XML数据的标准版本信息。您可以通过在浏览器中访问XML文件来查看分层的XML数据信息,如图1所示。
XML的发展非常迅速。近年来,许多软件开发人员已经开始采用XML的开发标准来开发应用程序。而且,很多新兴技术都是基于XML数据的。这意味着XML和HTML一样,将成为Web技术不可或缺的一部分。2简单的XML操作在实际应用中,PHP和XML之间的交互操作被广泛使用。SimpleXML组件是PHP5中新增加的一个SimpleXML操作组件。与传统的XML组件相比,SimpleXML组件使用起来非常简单。在本节中,将详细介绍使用简单XML组件操作XML的方法。2.1创建SimpleXML对象SimpleXML对象是用于临时存储XML数据的临时变量,对XML的所有操作都是通过操作SimpleXML对象来完成的。SimpleXML组件提供了两种创建SimpleXML对象的方法。第一种方法是使用simplexml_load_string函数读取字符串变量中的xml数据,其语法格式如下所示。这里的数据变量用于存储XML数据。下面的代码使用simplexml_load_string函数创建一个simplexml对象。复制的代码如下:Php $data=XML //定义XML数据?xml版本='1.0 '?离职姓名生产支持/员工姓名员工序列号_ no 100001/序列号_ no name Simon/姓名年龄24/年龄生日1982-11-06/生日工资5000.00/工资bonus 1000.00/奖金/员工序列号_ no 100002/序列号_ no name Elaine/姓名年龄24/年龄生日1982-01-01/生日工资6000.00/工资bonus 2000.00/$ XML=simple XML _ load _ string($ data);//创建SimpleXML对象print _ r($ XML);//输出XML?在上面的例子中,$data变量存储了一段XML数据。simplexml_load_string函数将变量$data转换为simplexml对象。从print_r函数的输出可以看出对象的结构,运行结果如下。复制代码如下: SimpleXML元素对象([分离]=数组([0]=SimpleXML元素对象([名称]=生产支持[员工])。=SimpleXMLElement Object([employee]=Array([0]=simplexmlement Object([serial _ no]=100001[name]=Simon[age]=24[生日]=1982-11-06[工资]=5000.00[奖金]=1000.00][1]=SimpleXMLElement Object([serial _ no]=100002[name]=Elaine[age]=24[生日]=1982-01=110001[姓名]=Helen[年龄]=23[生日]=1983-07-21[工资]=5000.00[奖金]=1000.00)))从输出结果可以看出,SimpleXML对象的结构与XML数据的格式完全相同。 第二种方法是使用simplexml_load_flie函数读取一个xml文件完成创建,其语法格式如下所示。这里的文件名变量是用来存储XML数据文件及其路径的文件名。下面的代码使用simplexml_load_file函数创建一个simplexml对象。复制代码如下:PHP $ XML=simple XML _ load _ file(' example . XML ');//创建SimpleXML对象print _ r($ XML);//输出XML?其中,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函数显示的信息更完整,其语法如下所示。Voidwar _ dump(对象1,对象2.)下面的代码使用var_dump函数输出上面例子中对象的详细信息。复制代码如下:PHP $ XML=simple XML _ load _ file(' example . XML ');//创建SimpleXML对象var _ dump($ XML);//输出XML?运行结果如下所示。复制代码如下:Object (SimpleXML元素)# 1(1){[' exit ']=Array(2){[0]=Object(SimpleXML元素)# 2 (2) {['Name']=String (18)。“生产支持”[employees]=object(SimpleXMLElement)# 4(1){[' employee ']=array(2){[0]=object(SimpleXMLElement)# 5(6){[' serial _ no ']=string(6)" 100001 "[ ' name ']=string(5)" Simon "[' age ']=string(2)" 24 "[ '生日']=string(10)" 1982-11-06 "[ ' salary ']=string(2) " 110001 "[' name ']=string(5)" Helen "[' age ']=string(2)" 23 "['生日']=string(10) "1983-07-21" [薪资']=string (7) "5000.00" ['奖金']=string (7) "1000.00"}}}}与之前的print_r输出结果相比,var_dump函数的输出结果结构更加严谨。 实际上,var_dump函数经常用于程序调试期间的对象检测。2.读取XML数据中的标签类似于数组类型的操作变量,读取XML也可以通过类似的方法完成。例如,如果需要读取上述XML数据中每个“exit”标签下的“name”属性,可以使用foreach函数来实现,如下面的代码所示。复制代码如下:PHP $ XML=simple XML _ load _ file(' example . XML ');foreach($ XML-作为$a离开){ echo " $ a-name BR ";} ?运行结果如下所示。生产支持测试中心//读取XML文件//循环读取XML数据中的每个分离标签//输出其中的名称属性。还可以使用方括号“]”直接读取XML数据中指定的标记。下面的代码输出上述XML数据中第一个“出发”标签的“名称”属性。复制代码如下:PHP $ XML=simple XML _ load _ file(' example . XML ');//读取XML文件echo $ XML-出发-名称[0];//输出节点?运行结果如下所示。生产支持SimpleXML组件提供了读取标签下所有子标签的子方法。例如,对于上面XML数据中的“exit”标签,有两个子标签:“name”和“employees”。下面的代码读取第一个“离开”标签下的子标签。复制代码如下:PHP $ XML=simple XML _ load _ file(' example . XML ');foreach($ XML-exit-Childers())作为$ exit)//回收读取exit标签下的子标签{ var _ dump($ exit);//输出标记的XML数据}?运行结果如下所示。
复制代码如下:对象(SimpleXML元素)# 3 (1) {[0]=字符串(18)“生产支持”}对象(SimpleXML元素)# 5 (1) {['employee']=数组(2) {[0]。=object(SimpleXMLElement)# 3(6){[' serial _ no ']=string(6)" 100001 "[ ' name ']=string(5)" Simon "[' age ']=string(2)" 24 "[ '生日']=string(10)" 1982-11-06 "[ '工资']=string(7)" 5000.00 "[ '奖金']=string(7)" 1000.00 " }[1]=object3.基于XML数据路径的查询SimpleXML组件提供了一种基于XML数据路径的查询方法。XML数据路径是从XML的根到某个标签的所有标签。此路径使用斜线“/”分隔标签名称。例如,对于上面的XML数据,要查询标签“name”中的所有值,标签“departments,departments,employee,employee”必须从根传递,所以路径是“/departments/departments/employee/name”。SimpleXML组件使用xpath方法解析路径,其语法格式如下。Xpath(字符串路径),其中path是路径。此方法返回一个包含所有要查询的标记值的数组。下面的代码查询上述XML数据中的所有名称标签。复制代码如下:PHP $ XML=simple XML _ load _ file(' example . XML ');//读取XML文件$ result=$ XML-XPath(“/departments/departments/employee/employee/name”);//定义节点var _ dump($ result);//输出节点?运行结果如下所示。复制代码如下: array(3){[0]=object(SimpleXML元素)# 2(1){[0]=string(5)“Simon”}[1]=object(SimpleXML元素)# 3 (1) {[0]=string (6)”。Elaine"} [2]=object (SimpleXML元素)# 4(1){[0]=string(5)“Helen”} }可以看到所有的名字标签都被查询到了。2.3 XML数据的修改XML数据的修改类似于读取XML数据中的标签。也就是说,通过直接修改SimpleXML对象中标签的值。下面的代码实现了对上述XML数据中第一个“离开”标签的“名称”子标签的修改。复制代码如下:PHP $ XML=simple XML _ load _ file(' example . XML ');//读取XML $ XML-部门-名称[0]=“人力资源”;//修改节点?修改后,对XML文件不会有任何影响。但是,在程序中,修改后的值将用于读取SimpleXML对象。2.4标准化XML数据SimpleXML还提供了一种标准化XML数据的方法,即asXML。asXML方法可以根据XML 1.0标准有效地重新排列SimpleXML对象的内容,并将它们作为字符串的数据类型返回。下面的代码标准化了上面的XML数据。复制代码如下:PHP $ XML=simple XML _ load _ file(' example . XML ');//读取XML数据echo $ XML-AsXMl();//标准化XML数据?2.5 XML数据的存储将SimpleXML对象中的XML数据存储到XML文件中的方法非常简单,即asXML方法的返回结果可以输出到文件中。下面的代码首先修改XML文件中的部门名称,然后将修改后的XML数据输出到另一个XML文件中。复制代码如下:PHP $ XML=simple XML _ load _ file(' example . XML ');//读取XML数据$ new XML=$ XML-AsXMl();//标准化的XML数据$ FP=fopen ("newxml.xml "," w ");//打开文件fwrite($fp,$newxml)写xml数据;//写入XML数据fc lose($ FP);//关闭文件?代码运行后,您可以看到newxml.xml文件中的XML数据如下。可以看到,对XML文件的修改已经保存在输出文件中。3.动态创建XML文档在实际应用中,有时需要动态生成XML文档。上面描述的简单XML组件没有提供创建XML文档的方法。
因此,如果需要动态创建XML文档,通常使用DOM组件来创建它们。DOM是文档对象模型的缩写,DOM组件为XML文档提供了树解析模式。下面的代码使用DOM组件来创建一个XML文档。复制代码如下:Php //新建一个DOM文档$ DOM=new DOM document();//在根节点创建departments标签$ departments=$ DOM-Create element(' departments ');$ DOM-append child($ started);//在departments标签下创建部门子标签$ department=$ DOM-Create element(' department ');$ exit-appendChild($ exit);//创建员工子标签$ employees=$ DOM-Create element(' employees ')在离开标签下;$ Beit-appendChild($ employees);//在employees标签下创建employee子标签$ employee=$ DOM-Create element(' employee ');$ employees-appendChild($ employee);//在员工标签下创建serial_no子标签$ serial _ no=$ DOM-Create element(' serial _ no ');$ employee-appendChild($ serial _ no);//为serial_no标记添加值节点100001 $ serial _ no _ value=$ DOM-createtextnode(' 100001 ');$ serial _ no-appendChild($ serial _ no _ value);//输出XML数据echo $ DOM-save XML();输出如下所示。xml版本=“1.0”?ts department employees雇员serial _ no 100001/serial _ no/employee/employees/department/department DOM组件不仅可以用来动态创建XML文档,还可以用来读取XML文件。下面的代码实现了读取前面的XML文件。复制代码如下:PHP $ DOM=new DOM document();//创建DOM对象$ DOM-load(' example . XML ');//读取XML文件$ root=$ DOM-document element;//获取XML数据的根read _ child($ root);//调用read_child函数读取根对象函数read _ child($ node){ $ children=$ node-childnodes;//获取$node的所有子节点foreach($ children as $ e)//循环读取每个子节点{ if($ e-nodetype==XML _ text _ node)//如果子节点是文本类型,则输出{echo $e-nodeValue,"BR。”br”;} else if($ e-nodetype==XML _ element _ node)//如果子节点是节点对象,则调用函数processing { read _ child($ e);} } } ?运行结果如下所示。复制的代码如下:指生产支持100001西蒙1982-11-06 5000.00 1000.00 10002伊莱恩24 1982-01-01 6000.00 2000.00测试中心110001乐和。23 1983-07-21 5000.00 1000.00以上示例对XML数据进行了递归处理,实现了输出XML数据中所有文本标签的功能。4 XML应用示例——消息书介绍了XML的基本操作。本节将以设计一个XML消息簿为例,详细说明如何在实际应用中实现PHP和XML数据的交互操作。4.1 XML文件结构设计XML文件用于存储XML数据,即消息簿中的消息。这里,对于每条消息,XML数据主要包括三项:消息标题、消息名称和消息内容。因此,XML文件的格式设计如下。复制代码如下:xml版本=“1.0”?线程线程标题这里是消息的标题/标题作者这里是消息接受者/作者内容这里是消息内容/内容/线程/线程4.2提交页面的编写提交消息页面由两个页面组成。一个是访问者用来写消息的表单的HTML文件,另一个是用来处理访问者输入的PHP脚本。表单的HTML代码如下所示。
复制代码代码如下: html标题发表新的留言/title meta http-equiv=" Content-Type " Content=" text/html;charset=GB 2312 "/头体H1p align="center "发表新的留言/p/H1表单名称="表格1 "方法="post "操作="发布。PHP "表格宽度="500"边框="0"对齐="中心"单元格填充="0"单元格间距=“0”tr TD标题/TD TD TD输入名称=" title " type=" text " id=" title " size=" 50 "/TD/tr tr TD作者/TD TD TD输入name=" author " type=" text " id=" author " size=" 20 "/TD/tr tr TD内容/TD tdtextarea name=" content " cols=" 50 " rows=" 10 " id=" content "/textarea/TD/tr/table p align=" center "输入类型=“提交”值=“提交”输入类型=“重置”值=“重置”/p/表单/正文/html对于用来处理用户输入的服务器端编程语言(专业超文本预处理器的缩写)脚本,其基本逻辑是首先创建一个数字正射影像图对象,然后读取可扩展置标语言文件中的可扩展置标语言数据,接下来在可扩展置标语言对象上创建新的节点并将用户的输入储存起来,最后将可扩展置标语言数据输出到原来的可扩展置标语言文件中。具体实现代码如下所示。复制代码代码如下: PHP $ guest book=new DOM document();//创建一个新的数字正射影像图对象$来宾簿加载('数据库/来宾簿。XML ');//读取可扩展置标语言数据$ threads=$ guest book-document元素;//获得可扩展置标语言结构的根//创建一个新线节点$ thread=$ guest book-create元素(' thread ');$ threads-appendChild($ thread);//在新的线节点上创建标题标签$ title=$ guest book-create元素(' title ');$ title-appendChild($ guest book-createTextNode($ _ POST[' title ']));$ thread-appendChild($ title);//在新的线节点上创建作者标签$ author=$ guest book-create元素(' author ');$ author-appendChild($ guest book-createTextNode($ _ POST[' author ']));$ thread-appendChild($ author);//在新的线节点上创建内容标签$ content=$ guest book-create元素(' content ');$ content-appendChild($ guest book-createTextNode($ _ POST[' content ']));$ thread-appendChild($ content);//将可扩展置标语言数据写入文件$fp=fopen("DB/guestbook.xml "," w ");if(fwrite($fp,$guestbook-saveXML())) echo "留言提交成功";否则回声"留言提交失败";fc输(FP美元);在浏览器中运行上述超文本标记语言文件并填写适当的留言内容,如图2所示
图2在发布新消息界面点击【提交】按钮后,XML文件中的内容如下。您可以看到消息已经存储在XML文件中。4.3显示页面的编译使用前面介绍的SimpleXML组件可以轻松实现显示页面,具体实现代码如下。复制代码如下:Php //打开用于存储消息的XML文件$ guest book=SimpleXML _ load _ file(' db/guest book . XML ');foreach($ guest book-thread as $ th)//循环读取XML数据中的每个线程标记{ echo " b title:/b }。$ th-title。”br”;呼应“b作者:/b”。$ th-作者。”br”;Echo "bcontent:/bpre "。$ th-内容。"/pre ";呼应“HR”;} ?在浏览器中查看运行结果,如图3所示。
PS:这里有一些关于xml操作的在线工具,供大家参考:
在线XML/JSON相互转换工具:http://tools.jb51.net/code/xmljson.
Xml在线格式化/XML在线压缩:http://tools.jb51.net/code/xmlformat.
XML在线压缩/格式化工具:http://tools.jb51.net/code/xml_format_compress.