php操作XML文件之SAX、simpleXML方式一、SAX,也就是simple API for XML,XML的简单应用接口具体步骤:创建XML
php操作XML文件之SAX、simpleXML方式
一、SAX,也就是simple API for XML,XML的简单应用接口
具体步骤:①创建XML解析器,使用xml_parser_create函数,参数是编码,返回值是对应的解析器资源
②创建解析处理函数,分别处理开始标签、结束标签、数据,设置标签的处理函数为xml_set_element_handler,三个参数,第一个是解析器资源,第二个是处理开始标签的函数名,第二个是处理结束标签的函数名;设置处理数据的函数为xml_set_character_data_handler,两个参数,第一个是解析器资源,第二个是处理数据的函数名;在这里定义的三个自定义函数是需要自己去实现的
③开始解析,xml_parse,三个参数,第一个是解析器资源,第二个是要处理的内容,这里的内容要求是字符串形式的,所以可以是通过file_get_contents函数读取文件得到的字符串,第三个参数设置为true的话,就是告诉解析器,当前已经是最后一个数据了,否则解析器就会继续等待,而不会认为是处理完毕,所以要得到错误,就需要设置为true,解析器处理完后知道后面没有要处理的数据了,就能判断有没有错误,有错误就会抛出
④出现错误如何处理,xml_get_error_code,xml_get_current_line_number,xml_get_current_column_number,分别是获得错误代码、获得错误所在行、获得错误所在列,参数都是解析器资源,还有一个xml_error_string获得错误信息,这个参数有点不一样,是以xml_get_error_code的返回值作为参数
这个方式的优缺点(相对于DOM方式):
①DOM需要将所有数据读取到内存,并将节点处理好之后再操作,SAX是读取一个,操作一个,释放一个
②当xml文档结构有错误时,DOM没有办法解析成DOM树,而SAX可以操作,直到发生错误的地方
③SAX只能读取数据,而DOM能做很多复杂的操作,SAX处理速度快,适合大文档
二、simpleXML,这是php专门提供的一种简单处理xml的方式,它将xml数据在内存中形成对象集合,相同级别的对象会转换成数组,操作起来很容易
步骤:①实例化一个SimpleXMLElement对象,参数是通过file_get_contents得到的字符串,此时获得的对象就相当于是xml文档的根元素,$sxe = new SimpleXMLElement($string);
②访问节点$sxe->book->title;,要访问一个节点,直接通过根节点指到下一个子节点,再一直指到要访问的节点即可,得到节点对象,可以直接使用echo输出节点里面的数据,因为对象中有一个类似__tostring的方法,还能以数组的方式访问,$sxe->book[2]->title,或者直接遍历foreach($sxe->book as $book){echo $book->title}
③增加节点$sxe->addChild('book', 'abcd'),参数分别是节点名、节点值,用这个方法可以在任意节点里面增加子节点
④增加属性:$book->addAttribute('id', 'book10')
⑤删除节点:unset($sxe->book[2]);
⑥更新节点:找到节点后直接赋值即可
④保存xml文件:$sxe->asXML('book.xml'); 参数是文件名
SimpleXMLElement对象与DOM对象的相互转换:
1、将dom转换成SimpleXMLElement:直接使用函数$sxe = simple_import_dom($doc); 其中$doc是要转换的dom对象
2、将SimpleXMLElement对象转换成dom对象:$root = dom_import_simplexml($sxe);现在得到的只是节点,因为$sxe本身就是相当于xml文档的根元素对象嘛,所以我们还需要创建dom树,然后将节点和树联系上:①$doc = new DOMDocument('1.0', 'utf-8'); ②$domelement = $doc->importNode($root, true),这里的true很重要,不设置的话,就只是将根元素节点对象放到dom树上了,用true表示递归的将所有节点都放到dom树上, ③$doc->appendChild($domelement); ④$doc->save('book.xml');