DOM、SAX、SimpleXML方式解析XML文档总结

本周学习知识点:

XML扩展性标记语言:

    

一.DOM方式操作

 

二.SAX方式操作

 

三.simpleXML的方式

 

四.DOM 与 simpleXML相互转换

 

五、DTD约束

 

六、将MySql数据写入XML文档

 

一.XML:

①.XML:

      扩展性标记语言;

  结构化文档、数据的通用且适应性强的格式

     ②.XML的作用:

       1.标准的数据格式,不仅可以在web领域传输,还可以在其他任何领域传输数据

       2.保存数据,我们可以将XML作为小型的数据库使用

       3.保存一个项目的配置文件

     ③.XML文档的规则:

   1. 必须有一个根元素

   2. 大小写敏感

   3. 有开始标签和结束标签,如果没有内容的话,可以使用 / 强制关闭

   4.标签中如果使用特殊字符,需要使用实体引用(通过符号来表示一个实体内容)

  < -------------->引用的是 <

  >-------------->引用的是 >

  &------------>引用的是&

  '-----------> 单引号'

  "----------->双引号"      

       5.注释的写法,和HTML的注释一样

 

     ④.PHP操作XML三种解析方法:

   1.  DOM方法:文档对象模型;和HTML的DOM操作非常类似

        2.SAX(Simple API for XML),通过XML的接口

        3.simple XML;php提供的一个对象,来操作XML文件

     ⑤.XML与HTML区别:

      HTML-----超文本标记语言(超出普通文本的范围)他的缺点就是标签只有他规定好的;

       XML------可扩展标记语言,他的标签可以任意定义,不受语言的限制。

二、DOM方式解析XML文档:

    ①.获得XML文档对象:

      文档对象模型,PHP想操作XML,需要先将XML文档转换成PHP可以操作的对象

       DOM方式解析XML文件需要的对象:

       DOMDocument:文档树的根元素

       DOMNodeList :元素的节点列表,索引从0开始

       DOMElement:具体的某一个元素节点

       DOMAttr:某一个具体的元素对象的属性对象,属性节点对象:

     ②.PHP对XML的CRUD(增删改查):

        1.PHP通过使用DOMDocument对象的load()方法创建一个XML文档树
   2.获得根元素getElementsByTagName /  documentElement

   3.创建元素节点,不需要指定这个元素的位置(游离状态的元素节点)createElement

   4.给他规定位置  appendChild()

   5.上一级追加下一集为子节点 

        6.保存成一个xml文档:使用save() ,参数是保存的文件名

 

     注:创建元素  createElement(“”) 第二个参数可写可不写,如果写了,表示创建这个元素的文本内容

     注:如果需要转换成格式良好的格式的话,使用 formatOutput = true(但是不建议使用 可阅读的格式)。

     ③.常用的属性获得元素节点对象:

       1.当前元素的父元素:parentNode

       2.当前元素的所有子元素:childNodes:返回值DOMNodeList

       3.当前元素的哥哥元素:previousSibling

       4.当前元素的弟弟元素:nextSibling

       5.当前元素的第一个子元素:firstChild

       6.当前元素的最后一个子元素:lastChild

       7.获得当前XML文档的根元素:整个文档对象的documentElement属性

④.文档对象:

       DOMDocument:整个文档对象:getElementByTagName  $doc 先实例化的对象

       DOMNodeList:获得的是节点列表:length  属性   item 方法

       DOMElement: 具体的某个元素节点:getElementsByTagName;

       DOMAttr:属性节点:createAttribute    getAttribute

三、SAX方式解析

    ①.SAX方式解析XML文档也是其他语言通用的方法(Simple API for XML: 简单的应用程序接口)

②.与DOM比较:

相对于DOM操作的缺点:

在DOM方式解析XML文档之前,需要先将这个XML文档转换成DOM节点树,保存到内存;

如果XML文档有错误,会导致整个XML文档都无法解析;

但是如果这个XML文档特别大的话,太浪费你的内存资源了.

    SAX优点在于:

解析不需要在内存中生成节点树;遇到一个标签 或者 遇到一个数据就解析一下,解析完毕,释放内存资源,缺点在于没办法确定节点之间的关系,只适合于处理数据,如果XML文档内容特别大,或者我们需要的只是数据,建议使用 SAX方式.

③.SAX解析XML文档需要用到的函数:XML解析器

xml_parser_create() : 创建一个解析器

xml_set_element_handler() 建立开始标签和结束标签处理器

xml_set_character_data_handler() 建立数据处理器

xml_parse()  开始解析XML文档

解析完毕,解析如果失败,获得错误信息:

$code=xml_get_error_code()  获得错误的代码/编号

xml_error_string($code)获得错误的信息

xml_get_current_line_number()   获得错误所在的行数

xml_get_current_column_number() 获得解析器错误所在的列数

④.CDATA:

       指的是:不被XML解析器解析的数据,如果数据被 <![CDATA[     ]]> 包起来,XML解析器就不再解析,原封不动的输出,通常用于 实体引用,特殊字符.

   ⑤.SAX  和 DOM的区别:

1. DOM 每次解析的时候都会把这个文档在内存中生成一颗节点树,SAX不会

2. SAX遇到一个标签就处理一下,遇到数据处理数据,处理结束就会被释放,节省内存

3. SAX适合于XML文档特别大的时候,或者SAX只适合处理数据,无法确定节点之间的关系,无法做更复杂的操作.

    

四、SimpleXML方式解析XML

     ①.PHP专门提供的解析XML文档的,比SAX处理起来更简单。

     ②.解析机制:

  非常简单:将所有的XML元素解析成一个一个的对象----->对象集合;其中如果元素名相同会将他们保存到对象数组中.

     ③.SimpleXML 这种方式解析规则:

    ①:将XML文档转换成一个对象数组,这个数组的格式完全按照XML文档的结构生成的

    ②:相同的元素也会转换成数组,下标根据顺序而来

    ③:如果访问元素节点,通过元素名字访问即可

    ④:如果访问的是属性节点,以数组下标的形式访问即可

    ⑤:循环遍历对象数组,获得每一个元素对象

     ④.增加元素节点:

   想在那里增加元素,就让父元素addChild() 

   需要注意:一定要保存:asXML()  saveXML() 

    ⑤.删除元素节点:

       unset() 指定删除的元素

五、DTD约束:目前流行的约束方法:DTD约束、Schema约束

①.验证别人给我们写的XML文件要符合一定的规则,然后才能进行下一步计划.

    ②.目前:最常用的DTD约束,还有Schema 约束

        涉及两个概念:

        格式良好的XML文档:符合XML语法规则的就是格式良好的。

        合法的XML文档:经过我们验证的XML文档才是合法的。

③.步骤:

         ①:先将规则写到等dtd文件中,再引入到xml 文件中(最常用)

             <!DOCTYPE 根元素 SYSTEM  “dtd文件名”>

        ②:在XML文档中定义验证规则:(引用实体用)

        ③:PHP解析XML文档之前,应该开启验证功能(默认是不验证的)

     ④.约束规则:

元素语法:

<!ELEMENT 元素名称 元素的特征>

①元素的特征:如果当前的元素有子元素的话,将子元素的列表写在这里(修饰数量)

*  +  ? 

* 任意个数

+  最少一个

? 0个或者1个

元素列表写到()里面,如果有多个子元素,用,隔开,注意:有顺序的

② 如果如果没有子元素,说明保存的是数据

   元素的特征就应该是 #PCDATA

    ⑤.约束属性:

        语法:<!ATTLIST 元素名 属性名 属性类型 属性特征>

属性类型:

ID:属性是唯一的

CDATA:属性是普通属性

 

        属性特征:

#REQUIRED属性一定要有

#IMPLIED属性是可选的

        注意:XML文档的id属性的值,不要写数字的形式

    ⑥.引用实体:

实体:保存的实实在在的东西

引用:建立一个符号,通过这个标记找到他;先在DTD文件中,定义一个实体,在XML文档中通过一个符号找到他.

     我们自己定义实体怎么使用?

        定义的时候,实体没有 & 和; 在XML文档中使用的时候,才加上 & ;

 

⑦.<!DOCTYPE bookshelf SYSTEM "validate.dtd"><!--外部加载验证文件-->最常用

    <!DOCTYPE NEWSPAPER [ ]>  内嵌样式(引用实体)

 

六、Xpath:

①XML path--->路径   指引我们找到某个元素的方法。

②Xpath 就是一门帮助我们定位节点(元素、属性)的语言,在Xpath之前,我们要想定位某个元素,需要一层一层的查找,复杂

     ③步骤:Xpath:就是定位节点的一门语言

        获得DOMDocument对象

        获得DOMXpath对象,参数$doc 

        定义规则(查询的方法)

       根据规则查找相应的元素(节点)利用DOMXpath的query()方法查询,参数为定义好的规则,得到的是一个NodeList。

 

七、Xpath查找方式:

    <?php

 /***

Xpath查找方式

 */

  header("Content-Type:text/html;charset=utf-8");

  $doc=new DOMDocument("1.0","utf-8");

  $doc->load("phone.xml");

  $Xpath=new DOMXpath($doc);

  //①通过某个元素的子元素的值进行查找

  $rule='/phone/goods[goods_id="1"]';

  $nodeList=$Xpath->query($rule);

 // echo $nodeList->item(0)->nodeValue;

 //②利用元素名称来查找:规则: //元素名

  $rule='//goods';

  $nodeList=$Xpath->query($rule);

  //echo $nodeList->item(2)->nodeValue;

  //③按照位置进行查找  规则: 

  $rule='/phone/goods/goods_id';

  $nodeList=$Xpath->query($rule);

  //echo $nodeList->item(0)->nodeValue;

  //④按照集合中的索引值进行查找,注意:索引值是从1开始

  $rule='/phone/goods[1]/goods_name';

  $list=$Xpath->query($rule);

  //echo $list->item(0)->nodeValue;

  //⑤利用元素的属性进行查找

   $rule='/phone/goods[@id="12"]';

   $list=$Xpath->query($rule);

   //echo $list->item(0)->nodeValue;

   //⑥查找元素的属性

   $rule='/phone/goods[@id="12"]';

   //执行

   $list=$Xpath->query($rule);

   echo $list->item(0)->nodeValue;

 

八、MySql写入XML文档

    <?php 

  $source=mysql_connect("localhost","root","");

  mysql_select_db("phone");

  mysql_query("set names utf8");

  $sql="select goods_id,goods_sn,goods_name from goods";

  $result= mysql_query($sql);

  $rows=array();

  $doc = new DOMDocument("1.0","utf-8");

  $phone=$doc->createElement("phone");

  while($rows = mysql_fetch_assoc($result)){ 

$goods = $doc->createElement("goods");

$goods_id = $doc->createElement("goods_id",$rows["goods_id"]);

$goods->appendChild($goods_id);

$goods_sn = $doc->createElement("goods_sn",$rows["goods_sn"]);

$goods->appendChild($goods_sn);

$goods_name = $doc->createElement("goods_name",$rows["goods_name"]);

$goods->appendChild($goods_name);

$phone -> appendChild($goods);

 }

$doc->appendChild($phone);

//$doc->formatOutput = true;

$doc->save("phone.xml");

mysql_close($source);

 

 

学习总结:

一.DOM方式对XML文档增删改查:

   ①.修改元素节点内容:

     <?php

$doc = new DOMDocument("1.0","utf-8");

$doc->load("test.xml");

$book = $doc->getElementsByTagName("book")->item(0);

$title = $book->getElementsByTagName("title")->item(0);

$title->nodeValue = "小兵张嘎";

$doc->save("test.xml");

   ②.增加节点

      <?php

header("Cache-Control:no-cache");//不缓存

$doc = new DOMDocument("1.0","utf-8");//文档对象

//创建一个根元素,游离状态

$bookshelf = $doc -> createElement("bookshelf");//创建节点

$doc -> appendChild($bookshelf);  //追加节点

//增加一本书

$book = $doc -> createElement("book");

$bookshelf->appendChild($book);

//给书增加标题和作者

//参数1,标签名

//参数2,文本内容

$title = $doc -> createElement("title","天龙八部");

$book->appendChild($title);

//增加作者

$author = $doc->createElement("author","金庸");

$book->appendChild($author);

$doc->formatOutput = true;  //良好格式

$doc->save("test.xml");     //保存文档

    ③.查询节点

      <?php

header("Cache-Control:no-cache");

//获得DOMDocument对象

$doc = new DOMDocument("1.0","utf-8");

//加载xml文件,在内存中生成一个节点树

$doc->load("book.xml");

//通过标签名字查找

$book = $doc->getElementsByTagName("book")->item(0);

$title = $book->getElementsByTagName("title")->item(0);

var_dump($title->nodeValue);

④.删除节点

   <?php

$doc = new DOMDocument("1.0","utf-8");

$doc -> load("test.xml");

//先查找父元素

$book = $doc->documentElement;

//再查找子元素

$title = $book->getElementsByTagName("title")->item(0);

$book->removeChild($title); //删除节点

//保存

$doc->save("test.xml");

      ⑤.常用的属性获得对象:

       <?php

    $doc = new DOMDocument("1.0","utf-8");

    $doc->load("book.xml");

    //$bookshelf = $doc -> getElementsByTagName("bookshelf")->item(0);

    $bookshelf = $doc->documentElement;

    $list = $bookshelf->childNodes->item(0);//获得当前元素的所有的子节点

    $parent = $list->parentNode->getAttribute("id");//获得当前元素的父元素

    $first = $bookshelf->firstChild->nodeValue;//获得第一个子节点

    $last = $bookshelf->lastChild->nodeValue;//最后一个子节点

    //同胞节点

    $firstNode = $bookshelf->firstChild;

    $second = $firstNode->nextSibling->nodeValue; //下一节点

    $node = $bookshelf->lastChild->previousSibling->nodeValue;//上一节点

    var_dump($node);

       ⑥.获得属性节点值:

        <?php

    $doc = new DOMDocument("1.0","utf-8");

    $doc -> load("book.xml");

    $bookshelf = $doc->getElementsByTagName("bookshelf")->item(0);

    $book = $bookshelf ->getElementsByTagName("book")->item(0);

    //获得当前元素对象的属性节点

    $id_attr = $book->getAttribute("id");//参数是属性名;返回值是这个属性的值

    var_dump($id_attr);

      ⑦.创建属性节点

        <?php

   $doc = new DOMDocument();//指的是整个节点树,整个文档范围

   $bookshelf = $doc->createElement("bookshelf");//指的是整个文档的最顶级的元素

   $doc->appendChild($bookshelf);

  //创建属性节点

      $id_attr = $doc->createAttribute("id");//参数是属性名,返回值属性节点对象

  $id_attr->value = "1";//访问属性节点的值使用 value 属性

  $bookshelf->appendChild($id_attr);

  $doc->save("book.xml");

     ⑧.XML文档格式:

        <?xml version="1.0" encoding="utf-8"?>

    <config>

<db>

<host>localhost</host>

<dbname>shop_test</dbname>

<user>admin</user>

<pass>admin123</pass>

</db>

<smarty>

<left_delimiter><!--</left_delimiter>

<right_delimiter>--></right_delimiter>

<directory>d:/tpl</directory>

</smarty>

   </config>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值