分类:
2008-04-12 17:37:01
用 读取和编写可扩展标记语言()看起来可能有点恐怖。实际上, 和它的所有相关技术可能是恐怖的,但是用 读取和编写 不一定是项恐怖的任务。首先,需要学习一点关于 的知识 —— 它是什么,用它做什么。然后,需要学习如何用 读取和编写 ,而有许多种方式可以做这件事。
本文提供了 的简短入门,然后解释如何用 读取和编写 。
什么是 ?
是一种数据存储格式。它没有定义保存什么数据,也没有定义数据的格式。 只是定义了标记和这些标记的属性。格式良好的 标记看起来像这样:
<name>Jack Herrington</name>
这个 <name> 标记包含一些文本:Jack Herrington。
不包含文本的 标记看起来像这样:
<powerUp />
用 对某件事进行编写的方式不止一种。例如,这个标记形成的输出与前一个标记相同:
<powerUp></powerUp>
也可以向 标记添加属性。例如,这个 <name> 标记包含 first 和 last 属性:
<name first="Jack" last="Herrington" />
也可以用 对特殊字符进行编码。例如,& 符号可以像这样编码:
&
包含标记和属性的 文件如果像示例一样格式化,就是格式良好的,这意味着标记是对称的,字符的编码正确。清单 1 且环莞袷搅己玫? 的示例。
清单 1. 图书列表示例
<books> <book> <author>Jack Herrington</author> <title> Hacks</title> <publisher>O'Reilly</publisher> </book> <book> <author>Jack Herrington</author> <title>Podcasting Hacks</title> <publisher>O'Reilly</publisher> </book> </books> |
<? $doc = new DOMDocument(); $doc->load( 'books.' ); $books = $doc->getElementsByTagName( "book" ); foreach( $books as $book ) { $authors = $book->getElementsByTagName( "author" ); $author = $authors->item(0)->nodeValue; $publishers = $book->getElementsByTagName( "publisher" ); $publisher = $publishers->item(0)->nodeValue; $titles = $book->getElementsByTagName( "title" ); $title = $titles->item(0)->nodeValue; echo "$title - $author - $publisher\n"; } ?> |
脚本首先创建一个 new DOMdocument 对象,用 load 方法把图书 装入这个对象。之后,脚本用 getElementsByName 方法得到指定名称下的所有元素的列表。
在 book 节点的循环中,脚本用 getElementsByName 方法获得 author、publisher 和 title 标记的 nodeValue。nodeValue 是节点中的文本。脚本然后显示这些值。
可以在命令行上像这样运行 脚本:
% e1.
Hacks - Jack Herrington - O'Reilly
Podcasting Hacks - Jack Herrington - O'Reilly
%
可以看到,每个图书块输出一行。这是一个良好的开始。但是,如果不能访问 DOM 库该怎么办?
[1] [2] [3] 下一页
用 SAX 解析器读取
读取 的另一种方法是使用 Simple API(SAX)解析器。 的大多数安装都包含 SAX 解析器。SAX 解析器运行在回调模型上。每次打开或关闭一个标记时,或者每次解析器看到文本时,就用节点或文本的信息回调用户定义的函数。
SAX 解析器的优点是,它是真正轻量级的。解析器不会在内存中长期保持内容,所以可以用于非常巨大的文件。缺点是编写 SAX 解析器回调是件非常麻烦的事。清单 3 显示了使用 SAX 读取图书 文件并显示内容的代码。
清单 3. 用 SAX 解析器读取图书
<? $g_books = array(); $g_elem = null; 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 = _parser_create(); _set_element_handler( $parser, "startElement", "endElement" ); _set_character_data_handler( $parser, "textData" ); $f = fopen( 'books.', 'r' ); while( $data = fread( $f, 4096 ) ) { _parse( $parser, $data ); } _parser_free( $parser ); foreach( $g_books as $book ) { echo $book['TITLE']." - ".$book['AUTHOR']." - "; echo $book['PUBLISHER']."\n"; } ?> |
<? $ = ""; $f = fopen( 'books.', 'r' ); while( $data = fread( $f, 4096 ) ) { $ .= $data; } fclose( $f ); preg_match_all( "/\<book\>(.*?)\<\/book\>/s", $, $bookblocks ); foreach( $bookblocks[1] as $block ) { preg_match_all( "/\<author\>(.*?)\<\/author\>/", $block, $author ); preg_match_all( "/\<title\>(.*?)\<\/title\>/", $block, $title ); preg_match_all( "/\<publisher\>(.*?)\<\/publisher\>/", $block, $publisher ); echo( $title[1][0]." - ".$author[1][0]." - ". $publisher[1][0]."\n" ); } ?> |
上一页 [1] [2] [3] 下一页
用 DOM 编写
读取 只是公式的一部分。该怎样编写 呢?编写 最好的方式就是用 DOM。清单 5 显示了 DOM 构建图书 文件的方式。
清单 5. 用 DOM 编写图书
<? $books = array(); $books [] = array( 'title' => ' Hacks', 'author' => 'Jack Herrington', 'publisher' => "O'Reilly" ); $books [] = array( 'title' => 'Podcasting Hacks', 'author' => 'Jack Herrington', 'publisher' => "O'Reilly" ); $doc = new DOMDocument(); $doc->formatOutput = true; $r = $doc->createElement( "books" ); $doc->appendChild( $r ); foreach( $books as $book ) { $b = $doc->createElement( "book" ); $author = $doc->createElement( "author" ); $author->appendChild( $doc->createTextNode( $book['author'] ) ); $b->appendChild( $author ); $title = $doc->createElement( "title" ); $title->appendChild( $doc->createTextNode( $book['title'] ) ); $b->appendChild( $title ); $publisher = $doc->createElement( "publisher" ); $publisher->appendChild( $doc->createTextNode( $book['publisher'] ) ); $b->appendChild( $publisher ); $r->appendChild( $b ); } echo $doc->save(); ?> |
% e4. <? version="1.0"?> <books> <book> <author>Jack Herrington</author> <title> Hacks</title> <publisher>O'Reilly</publisher> </book> <book> <author>Jack Herrington</author> <title>Podcasting Hacks</title> <publisher>O'Reilly</publisher> </book> </books> % |
<? $books = array(); $books [] = array( 'title' => ' Hacks', 'author' => 'Jack Herrington', 'publisher' => "O'Reilly" ); $books [] = array( 'title' => 'Podcasting Hacks', 'author' => 'Jack Herrington', 'publisher' => "O'Reilly" ); ?> <books> <? foreach( $books as $book ) { ?> <book> <title><? echo( $book['title'] ); ?></title> <author><? echo( $book['author'] ); ?> </author> <publisher><? echo( $book['publisher'] ); ?> </publisher> </book> <? } ?> </books> |
<books> <? foreach( $books as $book ) { $title = entities( $book['title'], ENT_QUOTES ); $author = entities( $book['author'], ENT_QUOTES ); $publisher = entities( $book['publisher'], ENT_QUOTES ); ?> <book> <title><? echo( $title ); ?></title> <author><? echo( $author ); ?> </author> <publisher><? echo( $publisher ); ?> </publisher> </book> <? } ?> </books> |