本周学习知识点: 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文档树 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解析器解析的数据,如果数据被 包起来,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 文件中(最常用)
②:在XML文档中定义验证规则:(引用实体用) ③:PHP解析XML文档之前,应该开启验证功能(默认是不验证的) ④.约束规则: 元素语法:
①元素的特征:如果当前的元素有子元素的话,将子元素的列表写在这里(修饰数量) * + ? * 任意个数 + 最少一个 ? 0个或者1个 元素列表写到()里面,如果有多个子元素,用,隔开,注意:有顺序的 ② 如果如果没有子元素,说明保存的是数据 元素的特征就应该是 #PCDATA ⑤.约束属性: 语法: 属性类型: ID:属性是唯一的 CDATA:属性是普通属性
属性特征: #REQUIRED属性一定要有 #IMPLIED属性是可选的 注意:XML文档的id属性的值,不要写数字的形式 ⑥.引用实体: 实体:保存的实实在在的东西 引用:建立一个符号,通过这个标记找到他;先在DTD文件中,定义一个实体,在XML文档中通过一个符号找到他. 我们自己定义实体怎么使用? 定义的时候,实体没有 & 和; 在XML文档中使用的时候,才加上 & ;
⑦.最常用 内嵌样式(引用实体)
六、Xpath: ①XML path--->路径 指引我们找到某个元素的方法。 ②Xpath 就是一门帮助我们定位节点(元素、属性)的语言,在Xpath之前,我们要想定位某个元素,需要一层一层的查找,复杂 ③步骤:Xpath:就是定位节点的一门语言 获得DOMDocument对象 获得DOMXpath对象,参数$doc 定义规则(查询的方法) 根据规则查找相应的元素(节点)利用DOMXpath的query()方法查询,参数为定义好的规则,得到的是一个NodeList。
七、Xpath查找方式:
/*** 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文档
$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);
|