zoukankan      html  css  js  c++  java
  • xml基础学习笔记04

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

      1、SimpleXML快速解析文档

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

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

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

        

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

    输出截图

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

      

      1 <?php
      2 /**
      3  * 
      4  * @authors wxb (http://www.cnblogs.com/wxb0328/)
      5  * @date    2014-10-06 23:00:19
      6  * 
      7  * 38集、xml与数组相互转换
      8  * 
      9  */
     10 
     11 $simxml = simplexml_load_file('./38.xml');
     12 
     13 //print_r($simxml);
     14 /**
     15  * 上面的是37集中开头SimpleXML解析开头说过的,我们可以看到SimpleXML的解析,一个SimpleXMLElement Object,
     16  * 对象中既有对象又有数组。比较混乱,一会使用->,一会又使用[],不利于我们运用,现在将其转换为数组
     17  */
     18 /**
     19  * 现在我们考虑怎样转换?
     20  * 我们可以看到:
     21  *        对象,用 属性名->属性值        存储变量
     22  *              用 对象名->属性名 调用变量值
     23  *        数组,用 键名 => 键值        存储变量
     24  *              用 数组[键名]        调用变量值
     25  *        我们完全可以将一个对象看成 一个关联数组
     26  * 有了上面的理解,我们这个xml转数组就有了思路
     27  * 1、我们先使用array 强制转换对象为数组,但是强制转换无法只能的将你的对象中的对象再转为数组,它只能够转换当前给定的数组
     28  * 2、基于1的分析,我们考虑写一个方法,这个方法就是将对象强制转换为数组
     29  * 3、在这个方法中我们使用is_array() 判断 如果是数组就不用转换,如果不是数组就转换
     30  * 4、然后我们递归的调用这个方法
     31  * 好了,思路有了!现在开始做
     32  */
     33  function XmlToArr($simpleXml) {
     34      /*
     35      这里是十八哥在视屏中的实例,如图3 
     36      $arr = (array) $simpleXml;
     37     foreach ($arr as $key => $value) {
     38         if($value instanceof SimpleXMLElement || is_array($value)){
     39             $arr[$key] = XmlToArr($value);
     40         }
     41     }
     42     */
     43     /*
     44     * 在十八个的实例中我发现,我发现我们要判断并且转换的不光是xml的对象,在数组的情况下也需要查看数组是否是二维的,
     45     * 如果是二维数组我们也需要继续递归调用方法,转换。
     46     * 看到这里,我们上面的的思路3就是有错误的,我们不能只是简单的判断是数组就不转化了,但是,我们可以这样做,当这个
     47     * 数组是一维数组的时候,就不需要转化了,但是怎样判断这个数组是一维数组?
     48     * 虽然这里是可以用程序判断的,但是要自己写,php并没有提供特定的函数方法。
     49     * 但是我们可以发现,当时一维数组时,数组能的值都是标量:
     50     * 标量变量是指那些包含了 integer、float、string 或 boolean的变量,而 array、object 和 resource 则不是标量。 
     51     * 基于这个思路,修改函数如下:
     52     * 判断如果是一个标量,此时我们已经到了一个数组的值的部分,那我们返回这个值给递归调用里面的$arr[$key]($arr[$key] = XmlToArr($value);)
     53      */
     54      if(is_scalar($simpleXml)) {
     55          return $simpleXml;
     56      }else {
     57          //如果不是标量,那此时这个$simpleXml 肯定是array、object 和 resource 其中一个,但是在xml中不可能是resource了
     58          // 无论你是array还是object,统统强制转化
     59          $arr = (array) $simpleXml;
     60          // 循环这个数组,然后递归调用这个海曙
     61         foreach ($arr as $key => $value) {
     62         $arr[$key] = XmlToArr($value);
     63         }
     64      }
     65     
     66     return $arr;
     67 }
     68 // 输出到页面,我们可以看到如图4,结果是完全一样的
     69 print_r(XmlToArr($simxml));
     70 
     71 /*****************************************************
     72     现在我们再将数组转化为xml
     73 *****************************************************/
     74 // 首先我们定义这个数组
     75 
     76                     
     77 $xmlArr = Array(
     78     'title' => '路遥-平凡的世界',
     79     'price' => 43,
     80     'comment' => array(
     81             0 => 'good book',
     82             1 => 'very help',
     83             2 => 'I think the book is best'
     84         )
     85 );
     86 // 数组转化为xml 方法
     87 function arrToxml($arr,$node = null) {
     88     if ($node === null) {
     89         $sx = new SimpleXMLElement("<?xml version='1.0' encoding='utf-8' ?><bookstore></bookstore>");
     90     }else{
     91         $sx = $node;
     92     }
     93     
     94     foreach ($arr as $key => $value) {
     95         if (is_scalar($value)) {
     96             /*
     97             $sx->addChild($key,$value);
     98             上面这种输出虽然也成功的看到了,但是xml抱错了(如图5),原因是xml的标签,节点不能以数字开头
     99             下面我们简单的做个判断,然后是数字的我们给拼接一个字母前缀
    100             成功输出(如图6)
    101             */
    102 
    103             if(is_numeric($key)) {
    104                 $sx->addChild('comm_'.$key,$value);
    105             }else{
    106                 $sx->addChild($key,$value);
    107             }
    108             
    109         }else {
    110             $tmpNode = $sx->addChild($key);
    111             arrToxml($value,$tmpNode);
    112         }
    113     }
    114     return $sx->saveXML();
    115 }
    116 header("content-type:text/xml");
    117 echo arrToxml($xmlArr);
    118 /******************************************
    119     如果要运行上面的程序,请将两部分分开运行(可以先注释掉其中的某个部分)
    120 ******************************************/
    121 ?>

    图3

    图4

    图5

    图6

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

    要仔细看代码的注释,

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

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

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

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

  • 相关阅读:
    第一次通过CLR Profile解决内存占用过高的问题
    未处理的异常
    var和dynamic的区别及如何正确使用dynamic?
    C#添加本地打印机
    CSS样式
    CSS选择器
    Winform 数据绑定
    [CLR via C#]值类型的装箱和拆箱
    Java Object
    设计模式_创建型模式
  • 原文地址:https://www.cnblogs.com/wxb0328/p/4019511.html
Copyright © 2011-2022 走看看