simplexml 对xml的增删改操作

simplexml 是php 处理xml 文件的一个方法,另一个是dom 处理,这里只说simplexml 。
目前php 处理xml 用的比较多,比较成熟的还是dom 。但dom 在速度和代码量上还是比较受人诟病的。

simplexml 的有些函数需要比较高版本的php ,建议是php5.2 以上。

一,新建xml

方法1 (普通新建文件):

<?php
/**
 * @author blog.anchen8.net
 * @copyright 2016
 */
$fp=fopen(‘xmldoc.xml‘,‘w‘);
var_dump($fp);
 $xmlContent=‘<?xml version="1.0" encoding="utf-8" ?> ‘;
 $xmlContent.=‘<navlist>‘;
 $xmlContent.=‘<nav id="1">‘;
 $xmlContent.=‘<name>我我我</name> ‘;
 $xmlContent.=‘<color>#000000</color> ‘;
 $xmlContent.=‘</nav>‘;  

 $xmlContent.=‘<nav id="2">‘;  

 $xmlContent.=‘<name>你你你</name> ‘;
 $xmlContent.=‘<color>#ffffff</color> ‘;
 $xmlContent.=‘</nav>‘;  

 $xmlContent.=‘<nav id="3">‘;
 $xmlContent.=‘<name>他他他</name> ‘;
 $xmlContent.=‘<color>#cccccc</color> ‘;
 $xmlContent.=‘</nav>‘;  

 $xmlContent.=‘</navlist>‘;
 fwrite($fp,$xmlContent);
 fclose($fp); 

 ?>

方法2 (使用simplexml 新建):

$fp=fopen(111.xml‘,‘w‘);
 $xmlContent=‘<?xml version="1.0" encoding="utf-8" ?><navlist></navlist>‘;
 fwrite($fp,$xmlContent);
 fclose($fp);

 $xml=simplexml_load_file(‘111.xml‘);
 $app=$xml->addChild(‘nav‘);
 $app->addAttribute(‘id‘,"1");
 $app->addChild(‘name‘,‘我我我‘);
 $app->addChild(‘color‘,‘#000000‘);

 $app=$xml->addChild(‘nav‘);
 $app->addAttribute(‘id‘,"2");
 $app->addChild(‘name‘,‘你你你‘);
 $app->addChild(‘color‘,‘#ffffff);

 $app=$xml->addChild(‘nav‘);
 $app->addAttribute(‘id‘,"3");
 $app->addChild(‘name‘,‘他他他‘);
 $app->addChild(‘color‘,‘#cccccc); 

 $xml->asXML(‘111.xml‘);

可以看到第一种方法其实只是普通的写入文件,第二种方法才是使用simplexml 新建xml 文件,但为什么我要把第一种普通方法放前面呢?因为本人测试了一下两种方法的运行时间,发现第一种方法使用的时间更少,所以建议使用普通的新建文件方法新建xml 文件就行了!

新建的文件结构如下:

<?xml version="1.0" encoding="utf-8"?>
<navlist>
 <nav id="1">
  <name>我我我</nname>
  <color>#000000/ncolor>
 </nav>
 <nav id="2">
  <name>你你你</name>
  <color>#ffffff</color>
 </nav> <nav id="3">
  <name>他他他</name>
  <color>#cccccc</color>
 </nav>
</navlist>

二,读取xml

  if($xml=simplexml_load_file(‘111.xml‘)){
          foreach($xml->nav as $list){
                       $value[]=get_object_vars($list);
          }
     }else{
              echo(‘load xml error!‘);
     }

get_object_vars 函数是把对象转化为数组,这样$value 就是一个Php 的普通数组了,大家可以print_r 一下这个数组,Php 数组的读取就不用我说了吧。

三,修改xml

,新建节点

 $xml=simplexml_load_file(‘111.xml‘);
 $app=$xml->addChild(‘nav‘);
 $app->addAttribute(‘id‘,"4");
 $app->addChild(‘name‘,‘它它它‘);
 $app->addChild(‘color‘,‘#000000‘);
 $xml->asXML(‘111.xml‘);

将追加作为最后一个节点

,修改节点

 $xml=simplexml_load_file(‘111.xml‘); 

 $xg=$xml->xpath("/navlist/nav[@id=‘3‘]");
 $xg[0]->name="他啊他啊";
 $xg[0]->color="#444444";
 $xml->asXML(‘111.xml‘);

修改了nav 属性id 为3 的节点

,删除节点

删除节点用unset 函数就行,但要删除指定节点比较麻烦,删除指定节点只能使用节点的索引值。

比如删除第二个节点(id 为2 的) :

$xml=simplexml_load_file(‘111.xml‘); 

unset($xml->nav[1]);

$xml->asXML(‘111.xml‘);

索引从0 开始,所以第二个节点的索引是1 。

如果想通过指定的属性删除,则需要循环所有节点获取指定属性的节点索引
如下:

$xml=simplexml_load_file(‘111.xml‘); 

$i=0;

 foreach($xml as $dup){
  $sc=$dup->attributes();
  if($sc[‘id‘]==2){
   unset($xml->nav[$i]);
  }
  $i++;
 }

$xml->asXML(‘111.xml‘);

四,删除xml

if(file_exists(‘111.xml‘)){
    unlink(‘111.xml‘);
 }

  五,xml文档与php在同一个文件里的情况

<?php
$xmldoc = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<phplamp>
    <post>
        <title id="1">PHP XML处理介绍一</title>
        <details>详细内容一</details>
    </post>
    <post>
        <title id="2">PHP XML处理介绍二</title>
        <details>详细内容二</details>
    </post>
    <post>
        <title id="3">PHP XML处理介绍三</title>
        <details>详细内容三</details>
    </post>
</phplamp>
XML;

 $movies = new SimpleXMLElement($xmldoc);
 foreach($movies as $key => $value) {
// 获取属性
    $attr = $value->title->attributes();
    echo "Id:" . $attr[‘id‘] . "<br />";
    echo "Title:" . $value->title . "<br />";
    echo "Details:" . $value->details . "<br /><br />";
 }
 //$words = $lib->xpath("//word");
 // echo $words[0][‘add‘].‘<br/>‘;
 echo $movies->title[0];

 ?>

 输出结果:

Id:1
Title:PHP XML处理介绍一
Details:详细内容一

Id:2
Title:PHP XML处理介绍二
Details:详细内容二

Id:3
Title:PHP XML处理介绍三
Details:详细内容三
时间: 2024-10-13 02:57:53

simplexml 对xml的增删改操作的相关文章

flex 操作xml 实现增删改查 .

一 在介绍Flex中操作XML之前,首先简单介绍下XML中的基本术语. 元素:XML中拥有开始标签和结束标签的这一块称为“元素”    节点:把XML元素与文本结合起来统称为节点    根节点:位于整个XML文当顶端的节点    文本节点:包含文本的节点    属性:元素的组成部分,以键/值形式放在元素标签内 用一个例子来说明 view plaincopy to clipboardprint?<root_node><!--这是一个根节点也是一个元素-->            &l

asp.net xml 增删改操作

1 user.xml 2 <?xml version="1.0" encoding="utf-8"?> 3 <user> 4 <person> 5 </person> 6 <person name="风拉" sex="男" age="25"> 7 <pass>123</pass> 8 <Address>大明<

OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当然,可以用代码生成器,不过配套的代码生成器暂时没有):又从网上找了一个封装了泛型方法的OracleHelper类,整合到一起,但貌似数据增删改查依然不方便:于是花了两天时间,在原有基础上对增删改查分页查询操作进行了面向对象的封装,并且对批量增删改操作进行事务封装,写事务代码更方便. 原理: 1.利用

【2017-05-02】winform弹出警告框是否进行增删改操作、记事本制作、对话框控件和输出输入流

一.winform弹出警告框是否进行增删改操作 第一个参数是弹出窗体显示的内容,第二个参数是标题,第三个参数是该弹窗包含确定和取消按钮. 返回的是一个枚举类接收一下. 再进行判断,如果点的是确定按钮,再进行下一步的增删改操作. 二.记事本的制作 1.菜单工具栏MenuStrip-插入标准项 2.TextBox -显示部分 小箭头 MultiLine 选中多行 Dock属性占满. 3.功能 - 撤销 - 剪切 - 粘贴 - 复制 - 删除 - 全选 - 时间 - 查找 单独做一个窗体点击打开 把主

详解连接SQL Server数据库的方法,并使用Statement接口实现对数据库的增删改操作

总结一下,连接SQL Server数据库需要以下几个步骤: 1. 导入驱动Jar包:sqljdbc.jar 2. 加载并注册驱动程序 3. 设置连接路径 4. 加载并注册驱动 5. 连接数据库 6. 操作数据库 7. 关闭连接 代码如下: ******************连接数据库******************* 1 package zj6_Test; 2 import java.sql.*; 3 public class Zj6_3 { 4 /** 5 * 使用Statement接口

JavaScript--DOM增删改操作

JavaScript使用DOM操作节点来进行增删改操作 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JavaScript操作DOM节点</title> <script type="text/javascript"> var flag = "帐号"; var flag1 = 0; funct

Jquery easyui开启行编辑模式增删改操作

来源:http://www.cnblogs.com/nyzhai/archive/2013/05/14/3077152.html Jquery easyui开启行编辑模式增删改操作先上图 Html代码: <table id="dd"> </table> 引入JS文件和CSS样式 <script src="http://www.cnblogs.com/Resources/jquery-easyui-1.2.3/jquery-1.4.4.min.js

表格的增删改操作

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>表格的增删改操作</title> <script type="text/javascript"> function createTable() { var body = document.getElementById(&quo

6.DOM对HTML元素的增删改操作

<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>节点的增删改操作</title> <script type="text/javascript"> function createNode(){ //创建一个li元素 var li = document.createElement(