用PHP读取和编写XML DOM的实现代码
前端之家收集整理的这篇文章主要介绍了
用PHP读取和编写XML DOM的实现代码,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
用 PHP 读取和编写可扩展标记语言(XML)看起来可能有点恐怖。实际上,XML 和它的所有相关技术可能是恐怖的,但是用 PHP 读取和编写 XML 不一定是项恐怖的任务。首先,需要学习一点关于 XML 的知识 —— 它是什么,用它做什么。然后,需要学习如何用 PHP 读取和编写 XML,而有许多种方式可以做这件事。
本文提供了 XML 的简短入门,然后解释如何用 PHP 读取和编写 XML。
什么是 XML?
XML 是一种数据存储格式。它没有定义保存什么数据,也没有定义数据的格式。XML 只是定义了
标记和这些
标记的
属性。格式良好的 XML
标记看起来像这样:
Jack Herrington 这个
标记包含一些文本:Jack Herrington。
不包含文本的 XML 标记看起来像这样:
用 XML 对某件事进行编写的方式不止一种。例如,这个标记形成的输出与前一个标记相同:
也可以向 XML 标记添加属性。例如,这个 标记包含 first 和 last 属性:
也可以用 XML 对特殊字符进行编码。例如,& 符号可以像这样编码:
&
包含标记和属性的 XML 文件如果像示例一样格式化,就是格式良好的,这意味着标记是对称的,字符的编码正确。清单 1 是一份格式良好的 XML 的示例。 清单 1. XML 图书列表示例
<div class="codetitle"><a style="CURSOR: pointer" data="45693" class="copybut" id="copybut45693" onclick="doCopy('code45693')"> 代码如下: <div class="codebody" id="code45693">
Jack Herrington
PHP Hacks
O'Reilly
Jack Herrington
Podcasting Hacks
O'Reilly
清单 1 中的 XML 包含一个图书列表。父标记
包含一组 标记,每个 标记又包含 、 和 标记。
当 XML 文档的标记结构和内容得到外部模式文件的验证后,XML 文档就是正确的。模式文件可以用不同的格式指定。对于本文来说,所需要的只是格式良好的 XML。
如果觉得 XML 看起来很像超文本标记语言(HTML),那么就对了。XML 和 HTML 都是基于标记的语言,它们有许多相似之处。但是,要着重指出的是:虽然 XML 文档可能是格式良好的 HTML,但不是所有的 HTML 文档都是格式良好的 XML。换行标记(br)是 XML 和 HTML 之间区别的一个好例子。这个换行标记是格式良好的 HTML,但不是格式良好的 XML:
This is a paragraph
With a line break
这个换行标记是格式良好的 XML 和 HTML:
This is a paragraph
With a line break
如果要把 HTML 编写成同样是格式良好的 XML,请遵循 W3C 委员会的可扩展超文本标记语言(XHTML)标准。所有现代的浏览器都能呈现 XHTML。而且,还可以用 XML 工具读取 XHTML 并找出文档中的数据,这比解析 HTML 容易得多。
使用 DOM 库读取 XML
读取格式良好的 XML 文件最容易的方式是使用编译成某些 PHP 安装的文档对象模型 (DOM)库。DOM 库把整个 XML 文档读入内存,并用节点树表示它,如图 1 所示。
图 1. 图书 XML 的 XML DOM 树
<IMG src="http:https://files.jb51.cc/upload/201102/20110203151600791.gif">
树顶部的 books 节点有两个 book 子标记。在每本书中,有 author、publisher 和 title 几个节点。author、publisher 和 title 节点分别有包含文本的文本子节点。
读取图书 XML 文件并用 DOM 显示内容的代码如清单 2 所示。
清单 2. 用 DOM 读取图书 XML
<div class="codetitle"><a style="CURSOR: pointer" data="37407" class="copybut" id="copybut37407" onclick="doCopy('code37407')"> 代码如下: <div class="codebody" id="code37407">
<?
PHP $doc = new DOMDocument();
$doc->load( 'books.xml' );
$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
方法把图书 XML 装入这个对象。之后,脚本用 getElementsByName
方法得到指定
名称下的所有元素的列表。
在 book 节点的循环中,脚本用 getElementsByName
方法获得 author、publisher 和 title
标记的 nodeValue。nodeValue 是节点中的文本。脚本然后
显示这些值。
可以在命令行上像这样运行
PHP 脚本:
%
PHP e1.
PHP PHP Hacks - Jack Herrington - O'Reilly
Podcasting Hacks - Jack Herrington - O'Reilly
%
可以看到,每个图书块
输出一行。这是一个良好的开始。但是,如果不能访问 XML DOM 库该怎么办?
用 SAX 解析器读取 XML
读取 XML 的另一种
方法是使用 XML Simple API(SAX)解析器。
PHP 的大多数安装都包含 SAX 解析器。SAX 解析器运行在回调模型上。每次打开或
关闭一个
标记时,或者每次解析器看到文本时,就用节点或文本的信息回
调用户定义的
函数。
SAX 解析器的优点是,它是真正轻量级的。解析器不会在内存中长期保持
内容,所以可以用于非常巨大的
文件。缺点是编写 SAX 解析器回调是件非常麻烦的事。清单 3
显示了使用 SAX 读取图书 XML
文件并
显示内容的
代码。
清单 3. 用 SAX 解析器读取图书 XML
<div class="codetitle">
<a style="CURSOR: pointer" data="15381" class="copybut" id="copybut15381" onclick="doCopy('code15381')"> 代码如下: <div class="codebody" id="code15381">
<?
PHP $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 = xml_parser_create();
xml_set_element_handler( $parser,"startElement","endElement" );
xml_set_character_data_handler( $parser,"textData" );
$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";
}
?>
--------------------------------------------------------------------------------
清单 4. 用正则表达式读取 XML