分类:
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>
|