用 PHP 读取和编写 XML

 
用 PHP 读取和编写 XML
参考 http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/
PHP 中解析 XML 的主要方法有两种:使用 DOM 库和使用 SAX 解析器。
一、读取解析 XML
1 、使用 DOM 库读取 XML
读取格式良好的 XML 文件最容易的方式是使用编译成某些 PHP 安装的文档对象模型 DOM )库。 DOM 库把整个 XML 文档读入内存,并用节点树表示它。
2、用 SAX 解析器读取 XML
读取 XML 的另一种方法是使用 XML Simple API SAX )解析器。 PHP 的大多数安装都包含 SAX 解析器。 SAX 解析器运行在回调模型上。每次打开或关闭一个标记时,或者每次解析器看到文本时,就用节点或文本的信息回调用户定义的函数。
SAX 解析器的优点是,它是真正轻量级的。解析器不会在内存中长期保持内容,所以可以用于非常巨大的文件。缺点是编写 SAX 解析器回调是件非常麻烦的事。
 
我使用的是SAX来解析XML,因为考虑到DOM库需要构建树节点,对性能影响可能会比使用SAX较大。
XML 图书列表示例
 
 <books>
 <book>
 <author>Jack Herrington</author>
 <title>PHP Hacks</title>
 <publisher>O'Reilly</publisher>
 </book>
 <book>
 <author>Jack Herrington</author>
 <title>Podcasting Hacks</title>
 <publisher>O'Reilly</publisher>
 </book>
 </books>
 
处理代码如下。
SAX 解析器读取图书 XML
 
 <?php
 $g_books = array();
 $g_elem = null;
 
// 该函数为读取一个标签时作的处理, $name 获取标签的名称,该处将标签名赋给 $g_elem ,在读取该标签内容时作判断。如果标签是 BOOK 就在 $g_books [] 中新增一个元素, $g_books [] 是一个二维数组
 function startElement( $parser, $name, $attrs )
 {
 global $g_books, $g_elem;
 if ( $name == 'BOOK' ) $g_books []= array();
 $g_elem = $name;
 }
  // 在该标签解析完成时作的处理
 function endElement( $parser, $name )
 {
 global $g_elem;
 $g_elem = null;
 }
 
   // 读取到该标签内容时作的处理,该处是将内容加到数组中。
 function textData( $parser, $text )
 {
 global $g_books, $g_elem;
 if ( $g_elem == 'AUTHOR' ||
 $g_elem == 'PUBLISHER' ||
 $g_elem == 'TITLE' )
 {
 $g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text;
 }
 }
 
  // 创建解析器
 $parser = xml_parser_create();
 
 xml_set_element_handler( $parser, "startElement", "endElement" );
 xml_set_character_data_handler( $parser, "textData" );
 
// 该处我们是直接处理字符串,则不需要读取文件这一步骤,直接运行 //xml_parse( $parser, $data );
 
 $f = fopen( 'books.xml', 'r' );
 
 while( $data = fread( $f, 4096 ) )
 {
 xml_parse( $parser, $data );
 }
 
// 释放
 xml_parser_free( $parser );
 
  // 该处根据页面需要显示。
 foreach( $g_books as $book )
 {
 echo $book['TITLE']." - ".$book['AUTHOR']." - ";
 echo $book['PUBLISHER']."/n";
 }
 ?>
 
脚本首先设置 g_books 数组,它在内存中容纳所有图书和图书信息, g_elem 变量保存脚本目前正在处理的标记的名称。然后脚本定义回调函数。在这个示例中,回调函数是 startElement endElement textData 。在打开和关闭标记的时候,分别调用 startElement endElement 函数。在开始和结束标记之间的文本上面,调用 textData startElement 标记查找 book 标记,在 book 数组中开始一个新元素。然后, textData 函数查看当前元素,看它是不是 publisher title author 标记。如果是,函数就把当前文本放入当前图书。为了让解析继续,脚本用 xml_parser_create 函数创建解析器。然后,设置回调句柄。之后,脚本读取文件并把文件的大块内容发送到解析器。在文件读取之后, xml_parser_free 函数删除解析器。脚本的末尾输出 g_books 数组的内容。
该示例是将内容解析到二维数组后再显示到页面中 ,也可以根据需要在上述回调函数中处理的时候直接输出页面。如 textData 中读取到内容的时候直接将内容 ECHO 在页面上。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值