详解SimpleXML添加_修改_删除_遍历XML节点属性
SimpleXML概述
要处理XML 文件,有两种传统的处理思路:SAX 和DOM。SAX 基于事件触发机制,对XML 文件进行一次扫描,完成要进行的处理;DOM 则将整个XML 文件构造为一棵DOM树,通过对DOM 树的遍历完成处理。这两种方法各有优缺点,SAX 的处理思路相对抽象,DOM 的处理过程相对烦琐,都不很适合新手的入门。
PHP5 推出了一套新的XML 处理函数,即SimpleXML。名如其实,SimpleXML 本身小巧精干,只提供了少量的几个方法函数,但用它处理起XML 文件功能却非常强大,操作也非常的简单。
首先,它提供有简单的函数可以从XML 文档、字符串、或DOM 对象上直接构造出SimpleXMLElement 对象;其次,SimpleXMLElement 提供有简单的方法可以进行属性、子节点、和XPath 的操作;然而,SimpleXML 最简单的地方是,它提供有使用标准对象的属性和对象迭代器进行节点操作的方法,这一处理思路使得用PHP 对XML 文档的处理得到了极大的简化。
SimpleXML操作简要总结
simplexml_load_file() 从 XML 文档获取 SimpleXMLElement 对象。 5
simplexml_load_string() 从 XML 字符串获取 SimpleXMLElement 对象。
simplexml_import_dom() 把 DOM 节点转换为 SimpleXMLElement 对象。
(以上3个加载函数返回SimpleXMLElement对象,其路径在根标记上)
addAttribute() 给 SimpleXML 元素添加一个属性。
addChild() 给 SimpleXML 元素添加一个子元素。
asXML() 从 SimpleXML 元素获取 XML 字符串。
attributes() 获取 SimpleXML 元素的属性。
children() 获取指定节点的子。
getName() 获取 SimpleXML 元素的名称。
xpath() 对 XML 数据运行 XPath 查询。
$xml->$key=$value; 修改指定标签的值
$xml->$key->attributes()->属性id=$attr; 修改属性的值
unset($xml->$key); 删除标签行
SimpleXML应用案例一:
$string = <<<XML
<a>
<foo name="one" game="lonely">1</foo>
<foo name="one" game="lonely">1</foo>
</a>
XML;
$xml = simplexml_load_string($string);
//显示xml属性,var_dump()、print_r不能够显示节点属性值
foreach($xml->foo[0]->attributes() as $a => $b) {
echo $a,'="',$b,"\"\n";
}
///给 SimpleXML 元素添加属性
$xml->addAttribute("type","html");
$xml->addAttribute("name","top");
$xml->foo[1]->addAttribute("other","ok");
var_dump($xml->foo[1]->attributes());
//向指定的 XML 节点添加一个子节点
$xml->addChild("data","2014.5.26");
var_dump($xml);
echo "<hr/>";
//把SimpleXMLElement对象返回可写入文件的文本字符串
print($xml->asXML());
SimpleXML应用案例二:
$string2=<<<XML
<note>
<to dd="等等">George</to>
<from nn="bb">John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
<a>
<b>
<c>text</c>
<c>stuff</c>
</b>
<d>
<c>code</c>
</d>
</a>
</note>
XML;
$xml2 = simplexml_load_string($string2);
// 遍历子节点的属性名和值
foreach ($xml2->children()as $child)
{
foreach($child->attributes() as $a => $b){
echo "<br/>".$child.":".$a."==".$b;
}
}
//遍历子节点之下的标签名和值
foreach($xml2->children() as $a=>$b){
echo "<br/>".$a."---".$b;
}
echo "<hr/>";
//只获取元素名称
foreach($xml2->children() as $ch){
echo "<br/>".$ch->getName();
}
echo "<hr/>";
//使用路径定位节点
$mynode=$xml2->xpath("/note/a/b");
var_dump($mynode);
asXML()将SimpleXML对象文本化并保存XML文件:
$file = fopen($url,"w");
fwrite($file,$xml->asXML());
fclose($file);
一个SimpleXML封装类:
class SimpleXML{
public $data="";
//从 XML 文档获取 SimpleXMLElement 对象
public function xml_simplexml_load_file($url){
if (file_exists($url)) {
$this->data=simplexml_load_file($url);
}else{
exit($url."<br/>文件不存在!");
}
}
// 从 XML 字符串获取 SimpleXMLElement 对象
public function xml_simplexml_load_string($xml_string){
$this->data=simplexml_load_string($xml_string);
}
//把 DOM 节点转换为 SimpleXMLElement 对象
public function xml_simplexml_import_dom($dom){
$this->data=simplexml_import_dom($dom);
}
// 给 SimpleXML 元素添加一个子元素
public function xml_addchild($simplexml,$name,$value){
$simplexml->addChild($name,$value);
}
// 给 SimpleXML 元素添加一个属性
public function xml_addattribute($simplexml,$name,$value){
$simplexml->addAttribute($name,$value);
}
//返回 SimpleXML 元素获取 XML 字符串
public function xml_asxml($simplexml){
return $simplexml->asXML();
}
//返回获取 SimpleXML 元素的属性
public function xml_attributes($simplexml){
return $simplexml->attributes();
}
//打印 SimpleXML 元素的属性
public function xml_attributes_show($simplexml){
foreach ($simplexml->attributes() as $a=>$b){
print($a."=".$b."<br/>");
}
}
//返回指定节点的子节点SimpleXML
public function xml_getchildren($simplexml){
return $simplexml->children();
}
//返回 SimpleXML 元素的名称
public function xml_getname($simplexml){
return $simplexml->getName();
}
//返回指定路径的SimpleXML
public function xml_getxpath($simplexml,$path_str){
return $simplexml->xpath($path_str);
}
//返回以标签名为键值,某一属性为值的数组
public function xml_getattributes_arr($attr_name){
$re_arr=array();
foreach ($this->data as $d){
foreach($d->attributes() as $a=>$b){
if($a==$attr_name)
$re_arr[$this->xml_getname($d)]=$b;
}
}
return $re_arr;
}
//检查是否存在重复的key
public function xml_rekey($key){
$re_bool=false;
foreach($this->data as $d){
if($this->xml_getname($d)==$key){
$re_bool=true;
}
}
return $re_bool;
}
//追加节点
public function xml_add($key,$value,$attr){
$this->data->addChild($key,$value);
$this->data->$key->addAttribute("nicheng",$attr);
}
//保存xml
public function xml_save($url){
$save_xml=$this->data->asXML();
$file = fopen($url,"w");
fwrite($file,$save_xml);
fclose($file);
}
//修改XML元素
public function xml_update($key,$value,$attr){
$this->data->$key=$value;
$this->data->$key->attributes()->nicheng=$attr;
}
//删除XML元素
public function xml_delete($key){
unset($this->data->$key);
}
}
详解SimpleXML添加_修改_删除_遍历XML节点属性的更多相关文章
- python添加、修改、删除、访问类对象属性的2种方法
1.直接添加.修改.删除.访问类对象属性 class Employee (object): empCount = 0 def __init__(self, name, salary) : self.n ...
- java操作xm——添加、修改、删除、遍历
package com.xml.zh; import javax.xml.parsers.*; import javax.xml.transform.Transformer; import javax ...
- jaxp的dom方式操作(查找、添加、修改、删除、遍历节点)
package cn.itcast.jaxptest; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;imp ...
- Quartz动态添加,修改,删除任务(暂停,任务状态,恢复,最近触发时间)
首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye GitChat 写博客 小程序 消息 登录注册 关闭 quartz_Cron表达式一分钟教程 09-05 ...
- JAVA 添加、修改和删除PDF书签
当阅读篇幅较长的PDF文档时,为方便我们再次阅读时快速定位到上一次的阅读位置,可以插入一个书签进行标记:此外,对于文档中已有的书签,我们也可以根据需要进行修改或者删除等操作.本篇文章将通过Java编程 ...
- MVC5 网站开发之八 栏目功能 添加、修改和删除
本次实现栏目的浏览.添加.修改和删除. 栏目一共有三种类型. 常规栏目-可以添加子栏目,也可以添加内容模型.当不选择内容模型时,不能添加内容. 单页栏目-栏目只有一个页面,可以设置视图. 链接栏目-栏 ...
- javascript里面的数组,json对象,动态添加,修改,删除示例
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
http://www.jb51.net/article/42016.htm 初识Jquery EasyUI看了一些博主用其开发出来的项目,页面很炫,感觉功能挺强大,效果也挺不错,最近一直想系统学习一套 ...
- Quartz动态添加、修改和删除定时任务
任务调度开源框架Quartz动态添加.修改和删除定时任务 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触 ...
随机推荐
- Python3 BeautifulSoup和Pyquery解析库随笔
BeautifuSoup和Pyquery解析库方法比较 1.对象初始化: BeautifySoup库: from bs4 import BeautifulSoup html = 'html strin ...
- 在Struts2的Action中取得请求参数值的几种方法
先看GetRequestParameterAction类代码: public class GetRequestParameterAction extends ActionSupport { priva ...
- 实践作业3:白盒测试----开始测试用例的设计DAY3
白盒测试与黑盒测试很大不同之处在于白盒测试必须读相应代码,对代码有一定了解的情况下针对代码的逻辑进行测试用例的设计.白盒测试有六种覆盖标准:语句覆盖.判定覆盖.条件覆盖.判定/条件覆盖.条件组合覆盖和 ...
- Request[]与Request.Params[] 差别
Request[]与Request.Params[] ,这二个属性都可以让我们方便地根据一个KEY去[同时搜索]QueryString.Form.Cookies 或 ServerVariables这4 ...
- css总结10:父标签没有定义高度,盒子异常移动
1 问题:在父标签没有定义高度的情况下,嵌套的盒子浮动后,父标签下面的元素发生位置错误. 2 解决方法: 2.1(大厂网页常用方法) 添加额外元素: 即:父标签下添加一个元素(.clearfix),去 ...
- Python&Django学习系列之-激活管理界面
1.创建你个人的项目与APP 2.填写你的数据库名称与数据库类型,这里使用内置的sqllite3 3.修改setting文件 a.将'django.contrib.admin'加入setting的IN ...
- java类创建时里面成员执行的先后顺序
静态代码块在类第一次使用的时候执行一次,在构造函数执行之前执行.只要用到类,哪怕new对象(比如只声明变量)也会被执行,且只执行一次.一般用于对类进行初始化. 先执行静态代码块,静态成员(谁在前就先执 ...
- Windows下配置Visualsvn Server时需要注意的几点事项
1配置用户组与用户 用户组的权限高于用户的权限, 如果一个用户只有只读权限,同时被加入了拥有写权限的用户组中,此用户可以执行写操作. 2在Pre-commit hook下增加 强制添加注释的钩子脚本 ...
- react-native-echarts构建的图表出现滚动条并且可以滑动的问题
前段时间做echarts饼状图,按照官方提供的写法完成以后图表可以出来,但是虚拟机上演示出现了滚动条,并且拖动时就会出现空白,双击会缩小像这样 参考GitHub上给出的方法修改成功: no ...
- angular 输出属性
import { Component, OnInit, EventEmitter, Output } from '@angular/core'; @Component({ selector: 'app ...