用 PHP 读取和编写 XML
参考
http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/
PHP
中解析
XML
的主要方法有两种:使用
DOM
库和使用
SAX
解析器。
一、读取解析
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>
|
处理代码如下。
<?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
在页面上。