无论是c/c++还是java、c#均有对XML文件操作的技术,PHP对XML文件的操作的技术主要有三种:
DOM、XPath、SimpleXml。
一、DOM
DOM:Document Object Model ,中文名字为“文档对象模型”
核心思想:把一个xml文件看作是一个对象模型,然后通过对象的方式来操作xml文件
注意:
当将xml文件看成对象的时候,一般将标签称作节点
解析xml文件的时候,相当于建立一棵树,树的节点可以表示标签、内容、属性等
DOM解析XML文件的流程:
1 PHP dom编程的步骤 2 1.创建DOMDocument 对象,代表文档xml。 3 $doc=new DOMDocument(); 4 如果是创建一个全新xml文档 5 $doc=new DOMDocument("1.0","utf-8"); 6 2.加载要处理的xml文档 7 $doc->load("xx.xml");//这个动作一旦形成,就会在内存形成DOM树。*********重点*********** 8 3.调用$list=$doc->getElementsByTagName("student");//获取节点列表 9 通过$list->length;获得学生的个数。 10 如果想要获得第一个学生,$stu1=$list->item(0); 11 //取出名字列表 12 $namelist=$stu1->getElementsByTagName("名字"); 13 //取出第一个名字: 14 $name1=$namelist->item(0)->nodeValue; 15 tip:如果你希望知道$xmldoc有哪些方法或者属性,可以通过var_dump();查看。 16 (DOMNodeList) 17 4.调用DOMDocument、DOMNodeList、DOMElement和DOMNode的方法来对xml进行各种操作
对于DOM解析XML文件的技术要点均在增删改查操作上,即crud操作,如果程序员可以使用DOM技术实现对学生的增删改查,那么基本上就可以认为掌握了DOM解析XML文件的核心技术。
以下使用DOM技术完成在线词典的案例,并实现增删查改的功能。
文件ciku.xml功能是存放单词,相当于一个小型数据库。
1 <?xml version="1.0" encoding="utf-8"?> 2 <root> 3 <word> 4 <en>word</en> 5 <ch>单词</ch> 6 </word> 7 <word> 8 <en>boy</en> 9 <ch>男孩</ch> 10 </word> 11 <word> 12 <en>girl</en> 13 <ch>女孩</ch> 14 </word> 15 <word id="123"><en>apple</en><ch>桃子</ch></word><word id="123"><en>apple</en><ch>苹果</ch></word></root>
文件interface.php提供了增删查改的图形化界面
1 <html> 2 <head> 3 <meta http-equiv="content-type" content="text/html;charset=utf-8"/> 4 </head> 5 <body> 6 <center> 7 <h1>谷歌在线词典</h1> 8 <br/><br/> 9 <h2>查询</h2> 10 <form action="process.php" method="post"> 11 请输入英语单词:<input type="text" name="en_search"/><br/><br/> 12 <input type="hidden" name="type" value="serch"/> 13 <input type="submit" value="单击此处查询"/> 14 <br/><br/><br/><br/> 15 </form> 16 17 <h2>添加</h2> 18 <form action="process.php" method="post"> 19 请输入英语单词:<input type="text" name="en_add"/><br/> 20 请输入汉语单词:<input type="text" name="ch_add"/><br/><br/> 21 <input type="hidden" name="type" value="add"/> 22 <input type="submit" value="单击此处添加新信息"/> 23 <br/><br/><br/><br/> 24 </form> 25 26 <h2>删除</h2> 27 <form action="process.php" method="post"> 28 请输入英语单词:<input type="text" name="en_delete"/><br/><br/> 29 <input type="hidden" name="type" value="delete"/> 30 <input type="submit" value="单击此处删除此单词"/> 31 <br/><br/><br/><br/> 32 </form> 33 34 <h2>修改</h2> 35 <form action="process.php" method="post"> 36 请输入英语单词:<input type="text" name="en_update"/><br/> 37 请输入汉语单词:<input type="text" name="ch_update"/><br/><br/> 38 <input type="hidden" name="type" value="update"/> 39 <input type="submit" value="单击此处修改信息"/> 40 <br/><br/><br/><br/> 41 </form> 42 43 </center> 44 </body> 45 </html>
文件process.php接收interface.php发来的请求,并处理。
1 <?php 2 require_once("functions.php"); 3 //1.接收输入的英文单词 4 $type=$_POST['type']; 5 //2.创建dom对象。 6 $domxml=new DOMDocument("1.0","utf-8"); 7 //3.加载xml文件 8 $domxml->load("ciku.xml"); 9 //分类 10 if($type=="search") 11 { 12 $en=$_POST['en_search']; 13 //执行查询功能 14 search($en,$domxml); 15 } 16 else if($type=="add") 17 { 18 $en=$_POST['en_add']; 19 $ch=$_POST['ch_add']; 20 add($en,$ch,$domxml); 21 } 22 else if($type=="delete") 23 { 24 $en=$_POST['en_delete']; 25 delete_($en,$domxml); 26 } 27 else if($type=="update") 28 { 29 $en=$_POST["en_update"]; 30 $ch=$_POST["ch_update"]; 31 echo "将要修改".$en."的释义"."$ch"; 32 //这里修改比较简单,不再阐述。 33 } 34 ?>
文件functions.php封装了四个方法,分别实现了增删查改的功能,由process.php调用
1 <?php 2 function serch($en,$domxml) 3 { 4 $root=$domxml->getElementsByTagName("root")->item(0)->getElementsByTagName("word"); 5 for($i=0;$i<$root->length;$i++) 6 { 7 $en_get=$root->item($i)->getElementsByTagName("en")->item(0)->nodeValue; 8 echo "英语:".$en_get; 9 $ch_get=$root->item($i)->getElementsByTagName("ch")->item(0)->nodeValue; 10 echo "  汉语:".$ch_get; 11 echo "<br/>"; 12 } 13 } 14 15 function add($en_value,$ch_value,$domxml) 16 { 17 18 //echo "英语:".$en."<br/>"."汉语:".$ch."<br/>"; 19 $word=$domxml->createElement("word"); 20 $en=$domxml->createElement("en"); 21 $ch=$domxml->createElement("ch"); 22 $en->nodeValue=$en_value; 23 $ch->nodeValue=$ch_value; 24 25 $root=$domxml->getElementsByTagName("root")->item(0); 26 27 $word->appendChild($en); 28 $word->appendChild($ch); 29 $root->appendChild($word); 30 31 //给单词加上属性值 32 $word->setAttribute("id","123"); 33 34 $domxml->save("ciku.xml"); 35 36 echo "添加信息成功!<br/>添加的信息为:<br/>英语单词:$en_value<br/>汉语单词:$ch_value<br/>"; 37 } 38 39 function delete_($en_value,$domxml) 40 { 41 //echo "将要删除".$en_value."单词!"; 42 $root=$domxml->getElementsByTagName("root")->item(0); 43 $word=$root->getElementsByTagName("word"); 44 for($i=0;$i<$word->length;$i++) 45 { 46 if($word->item($i)->getElementsByTagName("en")->item(0)->nodeValue==$en_value) 47 { 48 $root->removeChild($word->item($i)); 49 } 50 } 51 //删除掉信息之后千万要记得保存信息到XML文件 52 $domxml->save("ciku.xml"); 53 echo "成功删除了指定信息!"; 54 } 55 ?>
注意:增删改的操作操作完成以后要使用DomDocument的save方法将文件保存,否则操作不会生效。
二.XPath讲解
什么是XPath:
XPath是一种表示节点位置的语言,可以用来描述XML元素的位置,如同硬盘资料夹的档案路径:c:\wamp\www\uuu\myClass.xml
使用XPath的好处:
虽然使用PHPdom编程我们可以解决掉所有的问题,但是我们为了取得一个节点,往往要一层一层的剥开,非常麻烦。XPath解决了这个问题,XPath的最大好处就是跨层取节点。
XPath的核心设计思想:可以通过XPath迅速简捷的定位你希望查找的节点。
XPath的使用方法:
PHP程序在载入XML文件建立domdocument对象之后,就可以建立domxpath对象,如下所示:
$xpath=new DOMXPth($doc);
在建立好DOMXPath对象$xpath之后,就可以使用query()方法找出XPath位置路径表达式的节点对象。如下所示:
$items=$xp->query("xpath路径表达式");
上述query()方法的参数是XPath表达式,传回DOMNodeList对象,如果没有找到节点,就返回空。
代码示例:
data.xml装载了数据
1 <?xml version="1.0" encoding="utf-8"?> 2 <AAA> 3 <XXX> 4 <DDD> 5 <BBB/> 6 <BBB/> 7 <EEE/> 8 <FFF/> 9 </DDD> 10 </XXX> 11 <CCC> 12 <DDD> 13 <BBB/> 14 <BBB/> 15 <EEE/> 16 <FFF/> 17 </DDD> 18 </CCC> 19 <CCC> 20 <BBB> 21 <BBB> 22 <BBB/> 23 </BBB> 24 </BBB> 25 </CCC> 26 </AAA>
process.php内容是控制语句
1 <?php 2 $domxml=new DOMDocument("1.0","utf-8"); 3 $domxml->load("date.xml"); 4 $domxpath=new DOMXPath($domxml); 5 $nodelist=$domxpath->query("CCC/DDD/BBB");//换上不同的查询语句,即可获得不同的效果。 6 print_all($nodelist); 7 function print_all($nodelist) 8 { 9 echo "节点数量:".$nodelist->length."<br/>"; 10 for($i=0;$i<$nodelist->length;$i++) 11 { 12 echo $nodelist->item($i)->tagName."<br/>"; 13 } 14 } 15 ?>
注意上面的代码:$nodelist=$domxpath->query("CCC/DDD/BBB");query中的表达式是可以变的,而且非常灵活,详情可以查看XPath手册。
这个示例是XPath单独使用的案例,我们还可以将之与其它技术搭配使用,如SimpleXML
三、SimpleXML
SimpleXML,顾名思义,就是简单的XML,相对于DOM,SimpleXML操作XML文件更简单。
核心思想:以面向对象的方式来操作xml文件。
实质:PHP5的SimpleXML可以将XML文件的元素都转换成对象,相同子元素转换成对象数组,让我们在PHP程序直接使用foreach指令和取得指定元素的名称、内容和属性值。
3.1如何加载XML文件
simpleXML可以通过三种方式装载XML文件。
(1).直接装载文件。
(2).装载dom对象。
(3).装载字符串,该string要求按照xml文件的标准写。
3.1.1通过simplexml_load_file()函数来载入xml文件档案,
例如:$library=simplexml_loadfile("book.xml");
上述程序载入xml文件档案book.xml,函数传回SimpleXMLElement类型的对象,载入失败传回false
3.1.2通过装载字符串载入XML文件:
字符串需要特殊处理:$string =<<<XML 字符串内容 XML;这种写法是用于可以简单的处理字符中有“” 或者'的情况。
3.1.3通过simplexml_import_dom方法加载DOMDocument对象
3.2怎样取出属性的值?
属性值是节点的数组下标。
使用SimpleXML和XPath的综合小案例
data.xml存放数据
1 <?xml version='1.0' standalone='yes'?> 2 <movies> 3 <movie> 4 <title>PHP: Behind the Parser</title> 5 <characters> 6 <character> 7 <name>Ms. Coder</name> 8 <actor>Onlivia Actora</actor> 9 </character> 10 <character> 11 <name>Mr. Coder</name> 12 <actor>El ActÓr</actor> 13 </character> 14 </characters> 15 <plot> 16 So, this language. It's like, a programming language. Or is it a 17 scripting language? All is revealed in this thrilling horror spoof 18 of a documentary. 19 </plot> 20 <great-lines> 21 <line>PHP solves all my web problems</line> 22 </great-lines> 23 <rating type="thumbs">7</rating> 24 <rating type="stars">5</rating> 25 </movie> 26 </movies>
simplexml.php存放控制语句
1 <?php 2 $domxml=new DOMDocument(); 3 $domxml->load("data.xml"); 4 $movies = simplexml_import_dom($domxml); 5 6 echo $movies->movie[0]->plot."<br/>";//取出plot标签中中的内容。 7 echo $movies->movie[0]->rating[0]["type"]."<br/>";//取出第一个rating标签的type属性值。 8 echo "<br/>"; 9 $rusult=$movies->xpath("//rating");//SimpleXML和xpath相结合使用,功能更加强大。 10 var_dump($rusult); 11 echo "<br/>"; 12 foreach($rusult as $value) 13 { 14 echo $value."<br/>"; 15 } 16 17 ?>