无论是c/c++还是java、c#均有对XML文件操作的技术,PHP对XML文件的操作的技术主要有三种:

DOM、XPath、SimpleXml。

一、DOM

DOM:Document Object Model ,中文名字为“文档对象模型”

核心思想:把一个xml文件看作是一个对象模型,然后通过对象的方式来操作xml文件

注意:

当将xml文件看成对象的时候,一般将标签称作节点
解析xml文件的时候,相当于建立一棵树,树的节点可以表示标签、内容、属性等

DOM解析XML文件的流程:

 PHP dom编程的步骤
1.创建DOMDocument 对象,代表文档xml。
$doc=new DOMDocument();
如果是创建一个全新xml文档
$doc=new DOMDocument("1.0","utf-8");
2.加载要处理的xml文档
$doc->load("xx.xml");//这个动作一旦形成,就会在内存形成DOM树。*********重点***********
3.调用$list=$doc->getElementsByTagName("student");//获取节点列表
通过$list->length;获得学生的个数。
如果想要获得第一个学生,$stu1=$list->item(0);
//取出名字列表
$namelist=$stu1->getElementsByTagName("名字");
//取出第一个名字:
$name1=$namelist->item(0)->nodeValue;
tip:如果你希望知道$xmldoc有哪些方法或者属性,可以通过var_dump();查看。
(DOMNodeList)
4.调用DOMDocument、DOMNodeList、DOMElement和DOMNode的方法来对xml进行各种操作

对于DOM解析XML文件的技术要点均在增删改查操作上,即crud操作,如果程序员可以使用DOM技术实现对学生的增删改查,那么基本上就可以认为掌握了DOM解析XML文件的核心技术。

以下使用DOM技术完成在线词典的案例,并实现增删查改的功能。

文件ciku.xml功能是存放单词,相当于一个小型数据库。

 <?xml version="1.0" encoding="utf-8"?>
<root>
<word>
<en>word</en>
<ch>单词</ch>
</word>
<word>
<en>boy</en>
<ch>男孩</ch>
</word>
<word>
<en>girl</en>
<ch>女孩</ch>
</word>
<word id="123"><en>apple</en><ch>桃子</ch></word><word id="123"><en>apple</en><ch>苹果</ch></word></root>

文件interface.php提供了增删查改的图形化界面

 <html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head>
<body>
<center>
<h1>谷歌在线词典</h1>
<br/><br/>
<h2>查询</h2>
<form action="process.php" method="post">
请输入英语单词:<input type="text" name="en_search"/><br/><br/>
<input type="hidden" name="type" value="serch"/>
<input type="submit" value="单击此处查询"/>
<br/><br/><br/><br/>
</form> <h2>添加</h2>
<form action="process.php" method="post">
请输入英语单词:<input type="text" name="en_add"/><br/>
请输入汉语单词:<input type="text" name="ch_add"/><br/><br/>
<input type="hidden" name="type" value="add"/>
<input type="submit" value="单击此处添加新信息"/>
<br/><br/><br/><br/>
</form> <h2>删除</h2>
<form action="process.php" method="post">
请输入英语单词:<input type="text" name="en_delete"/><br/><br/>
<input type="hidden" name="type" value="delete"/>
<input type="submit" value="单击此处删除此单词"/>
<br/><br/><br/><br/>
</form> <h2>修改</h2>
<form action="process.php" method="post">
请输入英语单词:<input type="text" name="en_update"/><br/>
请输入汉语单词:<input type="text" name="ch_update"/><br/><br/>
<input type="hidden" name="type" value="update"/>
<input type="submit" value="单击此处修改信息"/>
<br/><br/><br/><br/>
</form> </center>
</body>
</html>

文件process.php接收interface.php发来的请求,并处理。

 <?php
require_once("functions.php");
//1.接收输入的英文单词
$type=$_POST['type'];
//2.创建dom对象。
$domxml=new DOMDocument("1.0","utf-8");
//3.加载xml文件
$domxml->load("ciku.xml");
//分类
if($type=="search")
{
$en=$_POST['en_search'];
//执行查询功能
search($en,$domxml);
}
else if($type=="add")
{
$en=$_POST['en_add'];
$ch=$_POST['ch_add'];
add($en,$ch,$domxml);
}
else if($type=="delete")
{
$en=$_POST['en_delete'];
delete_($en,$domxml);
}
else if($type=="update")
{
$en=$_POST["en_update"];
$ch=$_POST["ch_update"];
echo "将要修改".$en."的释义"."$ch";
//这里修改比较简单,不再阐述。
}
?>

文件functions.php封装了四个方法,分别实现了增删查改的功能,由process.php调用

 <?php
function serch($en,$domxml)
{
$root=$domxml->getElementsByTagName("root")->item(0)->getElementsByTagName("word");
for($i=0;$i<$root->length;$i++)
{
$en_get=$root->item($i)->getElementsByTagName("en")->item(0)->nodeValue;
echo "英语:".$en_get;
$ch_get=$root->item($i)->getElementsByTagName("ch")->item(0)->nodeValue;
echo "&nbsp;&nbsp;&nbsp汉语:".$ch_get;
echo "<br/>";
}
} function add($en_value,$ch_value,$domxml)
{ //echo "英语:".$en."<br/>"."汉语:".$ch."<br/>";
$word=$domxml->createElement("word");
$en=$domxml->createElement("en");
$ch=$domxml->createElement("ch");
$en->nodeValue=$en_value;
$ch->nodeValue=$ch_value; $root=$domxml->getElementsByTagName("root")->item(0); $word->appendChild($en);
$word->appendChild($ch);
$root->appendChild($word); //给单词加上属性值
$word->setAttribute("id","123"); $domxml->save("ciku.xml"); echo "添加信息成功!<br/>添加的信息为:<br/>英语单词:$en_value<br/>汉语单词:$ch_value<br/>";
} function delete_($en_value,$domxml)
{
//echo "将要删除".$en_value."单词!";
$root=$domxml->getElementsByTagName("root")->item(0);
$word=$root->getElementsByTagName("word");
for($i=0;$i<$word->length;$i++)
{
if($word->item($i)->getElementsByTagName("en")->item(0)->nodeValue==$en_value)
{
$root->removeChild($word->item($i));
}
}
//删除掉信息之后千万要记得保存信息到XML文件
$domxml->save("ciku.xml");
echo "成功删除了指定信息!";
}
?>

注意:增删改的操作操作完成以后要使用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装载了数据

 <?xml version="1.0" encoding="utf-8"?>
<AAA>
<XXX>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</XXX>
<CCC>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</CCC>
<CCC>
<BBB>
<BBB>
<BBB/>
</BBB>
</BBB>
</CCC>
</AAA>

process.php内容是控制语句

 <?php
$domxml=new DOMDocument("1.0","utf-8");
$domxml->load("date.xml");
$domxpath=new DOMXPath($domxml);
$nodelist=$domxpath->query("CCC/DDD/BBB");//换上不同的查询语句,即可获得不同的效果。
print_all($nodelist);
function print_all($nodelist)
{
echo "节点数量:".$nodelist->length."<br/>";
for($i=0;$i<$nodelist->length;$i++)
{
echo $nodelist->item($i)->tagName."<br/>";
}
}
?>

注意上面的代码:$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存放数据

 <?xml version='1.0' standalone='yes'?>
<movies>
<movie>
<title>PHP: Behind the Parser</title>
<characters>
<character>
<name>Ms. Coder</name>
<actor>Onlivia Actora</actor>
</character>
<character>
<name>Mr. Coder</name>
<actor>El ActÓr</actor>
</character>
</characters>
<plot>
So, this language. It's like, a programming language. Or is it a
scripting language? All is revealed in this thrilling horror spoof
of a documentary.
</plot>
<great-lines>
<line>PHP solves all my web problems</line>
</great-lines>
<rating type="thumbs">7</rating>
<rating type="stars">5</rating>
</movie>
</movies>

simplexml.php存放控制语句

 <?php
$domxml=new DOMDocument();
$domxml->load("data.xml");
$movies = simplexml_import_dom($domxml); echo $movies->movie[0]->plot."<br/>";//取出plot标签中中的内容。
echo $movies->movie[0]->rating[0]["type"]."<br/>";//取出第一个rating标签的type属性值。
echo "<br/>";
$rusult=$movies->xpath("//rating");//SimpleXML和xpath相结合使用,功能更加强大。
var_dump($rusult);
echo "<br/>";
foreach($rusult as $value)
{
echo $value."<br/>";
} ?>

【PHP对XML文件的操作技术【完整版】】的更多相关文章

  1. python开发_xml.dom_解析XML文档_完整版_博主推荐

    在阅读之前,你需要了解一些xml.dom的一些理论知识,在这里你可以对xml.dom有一定的了解,如果你阅读完之后. 下面是我做的demo 运行效果: 解析的XML文件位置:c:\\test\\hon ...

  2. Weui 文件上传完整版示例

    部分思路借用网友,部分是自己细化的. 先声明. 不多说,参考代码 @{ ViewBag.Title = "费用填报"; Layout = "~/Views/Shared/ ...

  3. springmvc web.xml和application.xml配置详情(附:完整版pom.xml)

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="htt ...

  4. 【PHP XML与dtd概述【完整版】】

    一.XML文件简介 关于XML的大多数人都知道一些,HTML->xhtml->xml,这个顺序本来应当是HTML发展的顺序. XML可以当做配置文件使用,还可以充当小型的数据库. vers ...

  5. office2016 软件全集 官方下载免费完整版(含破解文件)不含垃圾软件 win10完美激活

    office2016官方下载免费完整版是新一代办公软件,office2016官方下载免费完整版已经分享到下面,office2016官方下载免费完整版包括了Word.Excel.PowerPoint.O ...

  6. Djanjo 的app 模板路径 静态文件 完整版登录 新手三件套 以及orm

    一: django中app的概念: 一个项目可以包含多个应用(app,类似于模块,主页打开多个模块就是多个app) 创建了app,要在配置文件中注册 二:模板路径配置: 1 templates文件夹 ...

  7. ThinkPHP3.2.3完整版创建前后台入口文件 http://jingyan.baidu.com/article/7e4409533fc1092fc1e2ef53.html

    ThinkPHP3.2.3完整版创建前后台入口文件   1 2 3 4 5 6 7 分步阅读 ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的优秀的国产php框架,值得我们去探索学 ...

  8. Android照片墙完整版,的完美结合LruCache和DiskLruCache

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/34093441 在上一篇文章其中,我们学习了DiskLruCache的概念和基本使用 ...

  9. 免费的Lucene 原理与代码分析完整版下载

    Lucene是一个基于Java的高效的全文检索库.那么什么是全文检索,为什么需要全文检索?目前人们生活中出现的数据总的来说分为两类:结构化数据和非结构化数据.很容易理解,结构化数据是有固定格式和结构的 ...

随机推荐

  1. auto与decltype

    今天搜狗笔试的一道选择题,原题给忘了,但记得所考的知识点.知识点很基础,但很容易忽视. 具体内容可参考C++ Primer. auto :变量取auto后,其所对应的类型        auto一般会 ...

  2. 36 网络相关函数(四)——live555源码阅读(四)网络

    36 网络相关函数(四)——live555源码阅读(四)网络 36 网络相关函数(四)——live555源码阅读(四)网络 简介 7)createSocket创建socket方法 8)closeSoc ...

  3. Spring的scope="prototype"属性

    spring 默认scope 是单例模式这样只会创建一个Action对象每次访问都是同一个Action对象,数据不安全struts2 是要求 每次次访问 都对应不同的Actionscope=" ...

  4. python的变量作用域问题

    偶然掉进了一个坑里.仔细分析了下原因.原来是变量作用域的问题.简单抽象如下: id=1 #许多行代码 [id for id in range(10)] #许多行代码 if id!=1: #做一些事情 ...

  5. angulaijs中的ng-upload-file与阿里云oss服务的结合,实现在浏览器端上传文件到阿里云(速度可以达到1.5M)

    2015-10-26 angularjs结合aliyun浏览器端oos文件上传加临时身份验证例子 在服务端获取sts 源码: public class StsServiceSample { // 目前 ...

  6. HTML知识点链接

    1)<marquee>                    http://www.jb51.net/shouce/dhtml/objects/MARQUEE.html 2)"i ...

  7. Oracl各个版本的下载地址

    http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/112010-win32soft-098630-z ...

  8. POJ 2676

    http://poj.org/problem?id=2676 深搜的题目. 题意呢就是一个数独的游戏,应该都知道规则. 思路:我的思路很简单,就是用数组来判断某个数字是否可以使用,而每一个数字都由三个 ...

  9. CEF3开发者系列之外篇——IE中JS与C++交互

    使用IE内核开发客户端产品,系统和前端页面之间的交互,通常给开发和维护带来很大的便利性.但操作系统和前端之间的交互却是比较复杂的.具体来说就是脚本语言和编译语言的交互.在IE内核中html和css虽然 ...

  10. 解读Unity中的CG编写Shader系列八(镜面反射)

    转自http://www.itnose.net/detail/6117378.html 讨论完漫反射之后,接下来肯定就是镜面反射了 在开始镜面反射shader的coding之前,要扩充一下前面提到的知 ...