今天继续xml学习,主要是:SimpleXML快速解析文档、xml与数组相互转换 。博客中只是简单的做一个学习记录、积累。更加详细的使用方法,可以查看php手册

  1、SimpleXML快速解析文档

    前面的三篇博客中提到的主要是DOM解析XML文档,我们在使用的过程中可以明显的感觉到DOM解析虽然很强大,但是步骤繁琐。下面我们说一种相对简单的XML解析,

    SimpleXML解析xml文件非常简单,因为它一次性把xml文件解析成一个对象

    还是和以前一样,程序中的代码注释进行了详细的说明

    

 <?php
/**
* 37集、用SimpleXML快速解析文档
* 知识点:1、SimpleXML
* 2、Xpath
* SimpleXML解析xml文件非常简单,因为它一次性把xml文件解析成一个对象
*/
// simplexml_load_file() 从文件载入xml文档
$simxml = simplexml_load_file('./37.xml');
// 输出这个对象,我们看到如图1 所示的一个 SimpleXMLElement Object,
// 可以看出SimpleXML将xml文件解析成了一个包含对象和数组的混合
//print_r($simxml); // 找到 title 是 路遥-平凡的世界 并输出
echo $simxml->book[1]->title;
echo '<br />';
// 看看bookstore下有几本书,可是使用simplexml下面的count()方法
echo $simxml->count();
// 如图2 我们看到正确的得到了我们期望的结果
echo '<br />';
// 查看每本书中用几个子元素 $sons = $simxml->children();
foreach ($sons as $key => $value) {
echo '分别有'.$value->count().'个子元素:'.$value->getName().'<br />';
} ?>

输出截图

  2、38集、xml与数组相互转换

  

 <?php
/**
*
* @authors wxb (http://www.cnblogs.com/wxb0328/)
* @date 2014-10-06 23:00:19
*
* 38集、xml与数组相互转换
*
*/ $simxml = simplexml_load_file('./38.xml'); //print_r($simxml);
/**
* 上面的是37集中开头SimpleXML解析开头说过的,我们可以看到SimpleXML的解析,一个SimpleXMLElement Object,
* 对象中既有对象又有数组。比较混乱,一会使用->,一会又使用[],不利于我们运用,现在将其转换为数组
*/
/**
* 现在我们考虑怎样转换?
* 我们可以看到:
* 对象,用 属性名->属性值 存储变量
* 用 对象名->属性名 调用变量值
* 数组,用 键名 => 键值 存储变量
* 用 数组[键名] 调用变量值
* 我们完全可以将一个对象看成 一个关联数组
* 有了上面的理解,我们这个xml转数组就有了思路
* 1、我们先使用array 强制转换对象为数组,但是强制转换无法只能的将你的对象中的对象再转为数组,它只能够转换当前给定的数组
* 2、基于1的分析,我们考虑写一个方法,这个方法就是将对象强制转换为数组
* 3、在这个方法中我们使用is_array() 判断 如果是数组就不用转换,如果不是数组就转换
* 4、然后我们递归的调用这个方法
* 好了,思路有了!现在开始做
*/
function XmlToArr($simpleXml) {
/*
这里是十八哥在视屏中的实例,如图3
$arr = (array) $simpleXml;
foreach ($arr as $key => $value) {
if($value instanceof SimpleXMLElement || is_array($value)){
$arr[$key] = XmlToArr($value);
}
}
*/
/*
* 在十八个的实例中我发现,我发现我们要判断并且转换的不光是xml的对象,在数组的情况下也需要查看数组是否是二维的,
* 如果是二维数组我们也需要继续递归调用方法,转换。
* 看到这里,我们上面的的思路3就是有错误的,我们不能只是简单的判断是数组就不转化了,但是,我们可以这样做,当这个
* 数组是一维数组的时候,就不需要转化了,但是怎样判断这个数组是一维数组?
* 虽然这里是可以用程序判断的,但是要自己写,php并没有提供特定的函数方法。
* 但是我们可以发现,当时一维数组时,数组能的值都是标量:
* 标量变量是指那些包含了 integer、float、string 或 boolean的变量,而 array、object 和 resource 则不是标量。
* 基于这个思路,修改函数如下:
* 判断如果是一个标量,此时我们已经到了一个数组的值的部分,那我们返回这个值给递归调用里面的$arr[$key]($arr[$key] = XmlToArr($value);)
*/
if(is_scalar($simpleXml)) {
return $simpleXml;
}else {
//如果不是标量,那此时这个$simpleXml 肯定是array、object 和 resource 其中一个,但是在xml中不可能是resource了
// 无论你是array还是object,统统强制转化
$arr = (array) $simpleXml;
// 循环这个数组,然后递归调用这个海曙
foreach ($arr as $key => $value) {
$arr[$key] = XmlToArr($value);
}
} return $arr;
}
// 输出到页面,我们可以看到如图4,结果是完全一样的
print_r(XmlToArr($simxml)); /*****************************************************
现在我们再将数组转化为xml
*****************************************************/
// 首先我们定义这个数组 $xmlArr = Array(
'title' => '路遥-平凡的世界',
'price' => 43,
'comment' => array(
0 => 'good book',
1 => 'very help',
2 => 'I think the book is best'
)
);
// 数组转化为xml 方法
function arrToxml($arr,$node = null) {
if ($node === null) {
$sx = new SimpleXMLElement("<?xml version='1.0' encoding='utf-8' ?><bookstore></bookstore>");
}else{
$sx = $node;
} foreach ($arr as $key => $value) {
if (is_scalar($value)) {
/*
$sx->addChild($key,$value);
上面这种输出虽然也成功的看到了,但是xml抱错了(如图5),原因是xml的标签,节点不能以数字开头
下面我们简单的做个判断,然后是数字的我们给拼接一个字母前缀
成功输出(如图6)
*/ if(is_numeric($key)) {
$sx->addChild('comm_'.$key,$value);
}else{
$sx->addChild($key,$value);
} }else {
$tmpNode = $sx->addChild($key);
arrToxml($value,$tmpNode);
}
}
return $sx->saveXML();
}
header("content-type:text/xml");
echo arrToxml($xmlArr);
/******************************************
如果要运行上面的程序,请将两部分分开运行(可以先注释掉其中的某个部分)
******************************************/
?>

图3

图4

图5

图6

  好了,这篇就先这么多吧,代码中的注释很关键,由于没有将每一次运行的代码都写入到新的文件,都是先编写一部分,完成以后,再注释掉,所以大家在看的时候,一定

要仔细看代码的注释,

  也不是我这人太烂,只是相同的说明,没有必要在写博客的时候再提出来,既然都是干这个的,我相信大家都是有看注释的习惯的。而我就在写代码的时候把注释尽量写的

详细点,这样,写博客时我也能节省点时间,毕竟周末时间是宝贵的呀!

  虽然只是一点学习笔记,但是我觉得总是可以帮助到一些人,而且把东西分享出来,给别人开的东西也不能太差。就是这样的想法,我在学习的时候可能会更加用心。需要

学习的东西还有很多,没有办法做更多的深入的研究。这些笔记就算是xml的入门吧,以后工作中再去了解更多的xml的东西。

xml基础学习笔记04的更多相关文章

  1. xml基础学习笔记03

    继续上篇xml学习笔记,坚持.坚持.再坚持啊.... 本篇主要记录: 35.XML节点的删除与修改 36集.用XML制作RSS订阅源 <?php /* 笔记: 35.XML节点的删除与修改 使用 ...

  2. xml基础学习笔记05

    Xpath快速解析 如题一样,本篇主要说说Xpath快速查找XML文档   * Xpatn.Xquery,是专门用来查询xml的语言   * 查询xml非常快   Xpatn.Xquery,是专门用来 ...

  3. xml基础学习笔记01

    注意:刚刚看了网上对于XML中的标签,节点和元素?到底应该怎么表述?起初我也有这个疑惑,现在我的想法是:下面出现node的应称作节点,节点对象.element应称作元素,毕竟这更符合英文的本意.至于标 ...

  4. xml基础学习笔记02

    接着上次的xml笔记01 ,记录一下如何DOM创建xml 一.由于没有特意来写博客,都是在程序中用注释的方法记录笔记,整理过来难免格式错误,排版什么的,大家好事看不懂就仔细看给出的代码加上注释,一定会 ...

  5. xml基础学习笔记

    1 XML入门 1.1 引入 HTML: 负责网页的结构 CSS: 负责网页的样式(美观) Javascript: 负责在浏览器端与用户进行交互. 负责静态的网页制作的语言 HTML语言特点: 1)由 ...

  6. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  7. Redis:学习笔记-04

    Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...

  8. Maven基础学习笔记

    Maven基础学习笔记 下载链接 官网:https://maven.apache.org/ 所有版本:https://archive.apache.org/dist/maven/maven-3/ 阿里 ...

  9. 【C#编程基础学习笔记】4---Convert类型转换

    2013/7/24 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]4---Convert类型转换 ...

随机推荐

  1. 二十二、OGNL的一些其他操作

    二十二.OGNL的一些其他操作 投影 ?判断满足条件 动作类代码: ^ $   public class Demo2Action extends ActionSupport {     public ...

  2. 设计模式-单例模式(Singleton)

    模式说明: 保证每一个类仅有一个实例,并提供一个访问它的全局访问点(即自行实例化并向整个系统提供这个实例). 应用场景: 1.如配置文件取值类AppConfig(本身实例化对象比较大,且没有必要实例化 ...

  3. ASP.NET验证控件一

    为了更好地创建交互式Web应用程序.加强应用程序安全性,程序开发人员应该对用户输入的内容进行验证. ASP.NET提供了一系列输入验证控件,使用这些控件用户可以很方便地实现输入验证. ASP.NET还 ...

  4. java生成4个不同的随机数

    package lianxi; import java.util.Random; public class suijishu { public static void main(String[] ar ...

  5. 关于fork函数中的内存复制和共享

    原来刚刚开始做linux下面的多进程编程的时候,对于下面这段代码感到很奇怪, #include<unistd.h> #include<stdio.h> #include< ...

  6. linux安装桌面环境(GNOME)VNC连接Linux

    1.安装Gnome桌面 这里是使用的脚本安装.代码如下:  加附件 #!/bin/sh #This script is FREE and written by www.vpsyou.com   # i ...

  7. ADO.NET(很精彩全面)

    记录一下地址方便以后看http://www.cnblogs.com/liuhaorain/archive/2012/02/06/2340409.html

  8. css3干货

    CSS3是CSS2的升级版本,3只是版本号,它在CSS2.1的基础上增加了很多强大的新功能. 目前主流浏览器chrome.safari.firefox.opera.甚至360都已经支持了CSS3大部分 ...

  9. scala学习笔记2

    一.算术和操作符重载 a + b 是如下方法的简写: a.+(b) 在scala中你可以使用任何符号来为方法命名.比如BigInt类就定义了一个/%的方法,该方法返回一个对偶,对偶的内容是除法操作得到 ...

  10. php循环创建目录

    代码取自thinkphp中: function mk_dir($dir, $mod = 0777) { if(!is_dir($dir) || mkdir($dir, $mod)) { if(!mk_ ...