zoukankan      html  css  js  c++  java
  • 【PHP对XML文件的操作技术【完整版】】

    无论是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>
    View Code

    文件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>
    View Code

    文件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 ?>
    View Code

    文件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 "&nbsp;&nbsp;&nbsp汉语:".$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 ?>
    View Code

    注意:增删改的操作操作完成以后要使用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> 
    View Code

    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&#211;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>
    View Code

    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 ?> 
    View Code
  • 相关阅读:
    如何发布自定义的UI 组件库到 npmjs.com 并且编写 UI组件说明文档
    Go 包导入备忘
    Incorrect column count: expected 1, actual 5,JdbcTemplate queryForList 出错
    SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装
    Java最快的maven仓库地址,国内Maven地址,超快的Maven地址
    SQLyog-12.4.2版下载,SQLyog最新版下载,SQLyog官网下载,SQLyog Download
    easyui datebox定位到某一个日期, easyui datebox直接定位到具体的日期, easyui datebox MoveTo方法使用
    Echarts调整图表上下左右的间距,Echarts调整柱状图左右的间距
    Spring整合Quartz定时任务执行2次,Spring定时任务执行2次
    Linux关闭Tomcat为什么要用Kill,而不是shutdown.sh
  • 原文地址:https://www.cnblogs.com/kuangdaoyizhimei/p/3969771.html
Copyright © 2011-2022 走看看