复制代码 代码如下:

用 PHP 读取和编辑可扩展标识语言(XML)看起来也会有一些恐怖。实际上,XML
和它的全体相关手艺或然是恐惧的,可是用 PHP 读取和编辑 XML
不自然是项恐怖的天职。首先,要求上学一些有关 XML 的知识 ——
它是何等,用它做哪些。然后,要求学习怎样用 PHP 读取和编制XML,而有比非常多样情势能够做那件事。

用 PHP 读取和编辑可扩张标志语言(XML)看起来也有一些恐怖。实际上,XML
和它的富有有关本事可能是恐惧的,可是用 PHP 读取和编辑 XML
不必然是项恐怖的天职。首先,要求上学一些有关 XML 的知识 ——
它是什么样,用它做怎么样。然后,须求上学怎么用 PHP 读取和编辑
XML,而有许三种艺术能够做这事。
本文提供了 XML 的简单入门,然后解释如何用 PHP 读取和编辑 XML。
什么是 XML? XML
是一种多少存款和储蓄格式。它未有定义保存什么数据,也从不定义数据的格式。XML
只是概念了符号和那么些标识的属性。格式优良的 XML 标志看起来像这么:
<name>Jack Herrington</name>
以此 <name> 标识满含部分文件:杰克 Herrington。
不带有文本的 XML 标识看起来像那样:
<powerUp />
用 XML
对某事进行编写制定的不二秘诀持续一种。举例,这一个符号变成的输出与前八个标识一样:
<powerUp></powerUp>
也足以向 XML 标识加多属性。譬如,这几个 <name> 标识满含 first 和
last 属性:
<name first=”Jack” last=”Herrington” />
也足以用 XML 对特殊字符实行编码。比如,& 符号可以像这么编码:
&
满含标识和属性的 XML
文件借使像示例同样格式化,就是格式优秀的,那意味着标识是对称的,字符的编码正确。清单
1 是一份格式优异的 XML 的言传身教。

// 用 DOM 读取 XML
$doc = new DOMDocument();
$doc->load(‘test.xml’);
$books = $doc->getElementsByTagName(“book”);
foreach( $books as $book ){
$authors = $book->getElementsByTagName(“author”);
$author = $authors->item(0)->nodeValue; // nodeValue属
性可依照节点的种类来设置或回到某些节点的值。
$publishers = $book->getElementsByTagName(“publisher”);
$publisher = $publishers->item(0)->nodeValue;
$titles = $book->getElementsByTagName( ”title” );
$title = $titles->item(0)->nodeValue;
echo ”Title: $title <br> Author: $author <br> Publisher:
$publisher<br><hr><br>”;
}

本文提供了 XML 的简便入门,然后解释什么用 PHP 读取和编排 XML。

清单 1. XML 图书列表示例

/*
剧本首先创造二个 new DOMdocument 对象,用 load 方法把汉朝竹简 XML
装入这些目的。之后,脚本 用 getElementsByName
方法赢得内定名称下的有所因素的列表。
在 book 节点的大循环中,脚本用 getElementsByName 方法得到 author、
publisher 和 title 标识的 nodeValue。nodeValue
是节点中的文本。脚本然后显得这个值。
*/

什么是 XML?

复制代码 代码如下:

复制代码 代码如下:

XML
是一种多少存款和储蓄格式。它未有定义保存什么数据,也不曾定义数据的格式。XML
只是概念了符号和那些标志的特性。格式出色的 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
$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( ‘test.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”;
}

<name>Jack Herrington</name>

清单 1 中的 XML 满含三个书本列表。父标识 <books> 包蕴一组
<book> 标识,每一个 <book> 标志又含有
<author>、<title> 和 <publisher> 标志。
当 XML 文书档案的号子结商谈剧情获得外界格局文件的求证后,XML
文书档案正是不易的。情势文件能够用不一样的格式内定。对于本文来讲,所必要的只是格式特出的
XML。
若果以为 XML 看起来很像超文本标志语言(HTML),那么就对了。XML 和 HTML
都以基于标识的言语,它们有不胜枚举相似之处。不过,要珍视提议的是:固然 XML
文书档案大概是格式杰出的 HTML,但不是享有的 HTML 文档都以格式特出的
XML。换行标识(br)是 XML 和 HTML
之间分化的二个好例子。那么些换行标志是格式特出的 HTML,但不是格式特出的
XML:
<p>This is a paragraph<br>
With a line break</p>
以此换行标识是格式优良的 XML 和 HTML:
<p>This is a paragraph<br />
With a line break</p>
一旦要把 HTML 编写成一样是格式优异的 XML,请依据 W3C
委员会的可扩大超文本标志语言(XHTML)规范。全体当代的浏览器都能显现
XHTML。何况,还能用 XML 工具读取 XHTML 并寻觅文书档案中的数据,这比剖判HTML 轻便得多。
使用 DOM 库读取 XML
读取格式卓越的 XML 文件最轻巧的点子是使用编写翻译成某个 PHP
安装的文档对象模型 (DOM)库。DOM 库把全数 XML
文书档案读入内部存款和储蓄器,并用节点树表示它,如图 1 所示。
图 1. 图书 XML 的 XML DOM 树
yzc579亚洲城官网 1
树最上端的 books 节点有八个 book 子标识。在每本书中,有 author、publisher
和 title 多少个节点。author、publisher 和 title
节点分别有隐含文本的文本子节点。
读取图书 XML 文件并用 DOM 显示内容的代码如清单 2 所示。
清单 2. 用 DOM 读取图书 XML

/*
本子首先设置 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 数组的剧情。
*/
// 用正则表达式深入分析 XML

以此 <name> 标志满含部分文本:杰克 Herrington。

复制代码 代码如下:

复制代码 代码如下:

不带有文本的 XML 标识看起来像那样:

<?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”;
}
?>

$xml = ””;
$f = fopen( ‘test.xml’, ‘r’ );
while( $data = fread( $f, 4096 ) ) { $xml .= $data; }
fclose( $f );
preg_match_all( ”/\<book\>(.*?)\<\/book\>/s”, $xml,
$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” );
}

<powerUp />

本子首先制造八个 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

/*
自己从没建议采纳正则表明式读取
XML,可是一时它是包容性最棒的主意,因为正则表明式函数总是可用的。不要用正则表明式读取直接来源于用户
的 XML,因为不能调节那类 XML 的格式或结构。应当直接用 DOM 库或 SAX
分析器读取来自用户的 XML。
*/
// 用 DOM 编写 XML

用 XML
对某一件事进行编写制定的方法持续一种。举例,那一个符号产生的输出与前三个标识同样:

复制代码 代码如下:

复制代码 代码如下:

<powerUp></powerUp>

<?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”;
}
?>

$books = array();
$books [] = array(
‘title’ => ‘PHP 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->saveXML();

也足以向 XML 标志增添属性。举例,那些 <name> 标志包蕴 first 和
last 属性:

剧本首先设置 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 数组的开始和结果。
能够看来,那比编写 DOM 的同一遵循要劳累得多。若无 DOM 库也未曾 SAX

/*
在剧本的最上部,用有些演示图书装入了 books
数组。那些数量能够来自用户也足以来自数据库。
示范图书装入之后,脚本成立几个 new DOMDocument,并把根节点 books
增多到它。然后脚本为每本书 的 author、title 和 publisher
创造节点,并为各种节点添Gavin本节点。每一个 book
节点的最终一步是重复把它增多到根节 点 books。
使用 DOM 的的确价值在于它创立的 XML 总是格式准确的。然则一旦不能够用 DOM
创设 XML 时该如何做?
Xml代码

<name first=”Jack” last=”Herrington” />

库该咋办?还会有代表方案么?

回页首
用正则表明式深入分析 XML
能够一定,尽管提到那些点子,有个别程序员也会批评作者,但是的确能够用正则表明式深入分析XML。清单 4 展现了应用 preg_ 函数读取图书文件的示范。
清单 4. 用正则表达式读取 XML

复制代码 代码如下:

<?php
$xml = “”;
$f = fopen( ‘books.xml’, ‘r’ );
while( $data = fread( $f, 4096 ) ) { $xml .= $data; }
fclose( $f );
preg_match_all( “/\<book\>(.*?)\<\/book\>/s”,
$xml, $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” );
}
?>

请留心那么些代码有多短。开始时,它把公文读进贰个大的字符串。然后用二个regex 函数读取每一个图书品种。最终用 foreach
循环,在种种图书块间循环,并提抽取 author、title 和 publisher。
那么,缺欠在哪吧?使用正则表明式代码读取 XML
的主题素材是,它并没先进行反省,确定保障 XML
的格式杰出。那表示在读取之前,不也许知道 XML
是还是不是格式优良。并且,有些格式正确的 XML
恐怕与正则表明式不匹配,所以随后必须修改它们。
自家从未提出选取正则表明式读取
XML,可是有时它是包容性最棒的情势,因为正则表达式函数总是可用的。不要用正则表明式读取直接来源于用户的
XML,因为一点都不大概调节那类 XML 的格式或结构。应当直接用 DOM 库或 SAX

复制代码 代码如下:

也能够用 XML 对特殊字符实行编码。比如,& 符号能够像这么编码:

解析器读取来自用户的 XML。

回页首
用 DOM 编写 XML
读取 XML 只是公式的一部分。该如何编写 XML 呢?编写 XML 最棒的主意正是用
DOM。清单 5 彰显了 DOM 创设图书 XML 文件的章程。
清单 5. 用 DOM 编写图书 XML

复制代码 代码如下:

<?php
$books = array();
$books [] = array(
‘title’ => ‘PHP 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->saveXML();
?>

在本子的顶上部分,用一些演示图书装入了 books
数组。那么些数额可以来自用户也得以来自数据库。
演示图书装入之后,脚本成立二个 new DOMDocument,并把根节点 books
加多到它。然后脚本为每本书的 author、title 和 publisher
成立节点,并为每种节点添Gavin本节点。每一种 book
节点的终极一步是再次把它增加到根节点 books。
本子的尾声用 saveXML 方法把 XML 输出到调整台。(也足以用 save
方法创制七个 XML 文件。)脚本的出口如清单 6 所示。
清单 6. DOM 营造脚本的输出

复制代码 代码如下:

php e4.php
<?xml version=”1.0″?>
<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>

运用 DOM 的真的价值在于它创造的 XML 总是格式精确的。可是假如不可能用 DOM

<?php
PHP 编写xml
$books = array();
$books [] = array(
‘title’ => ‘PHP Hacks’,
‘author’ => ‘Jack Herrington’,
‘publisher’ => ”O’Reilly”
);
$books [] = array(
‘title’ => ‘Podcasting Hacks’,
‘author’ => ‘Jack Herrington’,
‘publisher’ => ”O’Reilly”
);
?>
<books>
<?php
foreach( $books as $book )
{
?>
<book>
<title><?php echo( $book[‘title’] ); ?></title>
<author><?php echo( $book[‘author’] ); ?>
</author>
<publisher><?php echo( $book[‘publisher’] ); ?>
</publisher>
</book>
<?php
}
?>
</books>

&

始建 XML 时该如何是好?

回页首
用 PHP 编写 XML
假若 DOM 不可用,可以用 PHP 的文件模板编写 XML。清单 7 展现了 PHP
如何创设图书 XML 文件。
清单 7. 用 PHP 编写图书 XML

复制代码 代码如下:

<?php
$books = array();
$books [] = array(
‘title’ => ‘PHP Hacks’,
‘author’ => ‘Jack Herrington’,
‘publisher’ => “O’Reilly”
);
$books [] = array(
‘title’ => ‘Podcasting Hacks’,
‘author’ => ‘Jack Herrington’,
‘publisher’ => “O’Reilly”
);
?>
<books>
<?php
foreach( $books as $book )
{
?>
<book>
<title><?php echo( $book[‘title’] ); ?></title>
<author><?php echo( $book[‘author’] ); ?>
</author>
<publisher><?php echo( $book[‘publisher’] ); ?>
</publisher>
</book>
<?php
}
?>
</books>

剧本的顶端与 DOM 脚本类似。脚本的底层伸开 books
标志,然后在种种图书中迭代,创设 book 标志和具有的内部 title、author 和
publisher 标识。
这种办法的主题材料是对实业进行编码。为了保险实体编码正确,必须在每一种门类上调用
htmlentities 函数,如清单 8 所示。
清单 8. 使用 htmlentities 函数对实体编码

复制代码 代码如下:

<books>
<?php
foreach( $books as $book )
{
$title = htmlentities( $book[‘title’], ENT_QUOTES );
$author = htmlentities( $book[‘author’], ENT_QUOTES );
$publisher = htmlentities( $book[‘publisher’], ENT_QUOTES );
?>
<book>
<title><?php echo( $title ); ?></title>
yzc579亚洲城官网,<author><?php echo( $author ); ?> </author>
<publisher><?php echo( $publisher ); ?>
</publisher>
</book>
<?php
}
?>
</books>

那正是用为重的 PHP 编写 XML 的讨厌之处。您感觉本人创办了到家的

实例中用到的 test.xml 如下:

包涵标识和品质的 XML
文件假设像示例同样格式化,正是格式杰出的,那意味着标识是对称的,字符的编码无误。清单
1 是一份格式出色的 XML 的演示。

XML,可是在筹算动用数据的时候,马上就能发觉一些因素的编码不得法。

结束语
XML 周边总有不计其数言过其实之处和混淆之处。可是,并不像你想像的那么难 ——
特别是在 PHP 那样优异的言语中。在明亮并正确地完结了 XML
之后,就能够开采有十分的多精锐的工具得以动用。XPath 和 XSLT
正是如此多少个值得商讨的工具。

复制代码 代码如下:

 

你大概感兴趣的稿子:

  • PHP XML操作类DOMDocument
  • php中DOMDocument简单用法示例代码(XML创造、加多、删除、修改)
  • DOM基础及php读取xml内容操作的艺术
  • php中央银行使DOM类读取XML文件的贯彻代码
  • PHP5中使用DOM调节XML完结代码
  • php中DOMElement操作xml文书档案实例演示
  • 运用PHP
    DOM-XML创立和深入分析XML文件
  • 用PHP达成读取和编排XML
    DOM代码
  • php基于dom完结读取图书xml格式数据的方法
  • PHP基于DOM创建xml文书档案的办法以身作则
  • PHP落成利用DOM将XML数据存入数组的诀窍身体力行

<?xml version=”1.0″ encoding=”utf8″?>
<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>

清单 1. 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 XML操作类DOMDocument
  • php中DOMDocument简单用法示例代码(XML创立、增加、删除、修改)
  • DOM基础及php读取xml内容操作的诀窍
  • php中选拔DOM类读取XML文件的落到实处代码
  • PHP5中央银行使DOM调节XML完毕代码
  • php中DOMElement操作xml文书档案实例演示
  • 用PHP读取和编辑XML
    DOM的贯彻代码
  • 运用PHP
    DOM-XML创设和平化解析XML文件
  • php基于dom完结读取图书xml格式数据的艺术
  • PHP基于DOM创设xml文书档案的格局亲自过问
  • PHP完毕应用DOM将XML数据存入数组的办法自己要作为模范遵守规则

清单 1 中的 XML 包罗贰个图书列表。父标识 <books> 包罗一组
<book> 标识,每一种 <book> 标识又富含<author>、<title> 和 <publisher> 标识。

当 XML 文书档案的暗记结构和内容获得外界方式文件的证实后,XML
文书档案正是合情合理的。方式文件能够用不一致的格式钦赐。对于本文来讲,所急需的只是格式优良的
XML。

若果认为 XML 看起来很像超文本标识语言(HTML),那么就对了。XML 和 HTML
都以依照标识的语言,它们有不胜枚举相似之处。不过,要注重建议的是:固然 XML
文书档案只怕是格式特出的 HTML,但不是颇具的 HTML 文书档案都以格式优异的
XML。换行标识(br)是 XML 和 HTML
之间不同的一个好例子。那几个换行标识是格式出色的 HTML,但不是格式出色的
XML:

<p>This is a paragraph<br>
With a line break</p> 
其一换行标志是格式卓越的 XML 和 HTML:

<p>This is a paragraph<br />
With a line break</p> 
若果要把 HTML 编写成一样是格式突出的 XML,请按照 W3C
委员会的可扩充超文本标识语言(XHTML)标准(参见
参考资料)。全体今世的浏览器都能显现 XHTML。并且,还足以用 XML 工具读取
XHTML 并找寻文书档案中的数据,那比深入分析 HTML 轻便得多。

 

 

 回页首 
 

 

使用 DOM 库读取 XML

读取格式特出的 XML 文件最轻便的章程是接纳编写翻译成有个别 PHP
安装的文书档案对象模型 (DOM)库。DOM 库把任何 XML
文书档案读入内部存款和储蓄器,并用节点树表示它,如图 1 所示。

 

图 1. 图书 XML 的 XML DOM 树
 

树顶端的 books 节点有多个 book 子标识。在每本书中,有 author、publisher
和 title 多少个节点。author、publisher 和 title
节点分别有隐含文本的文本子节点。

读取图书 XML 文件并用 DOM 展现内容的代码如清单 2 所示。

 

清单 2. 用 DOM 读取图书 XML
  <?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 
  <?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”;
  }
  ?>
  

本子首先设置 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 数组的源委。

能够看出,那比编写 DOM 的同等效果要艰巨得多。若无 DOM 库也未有 SAX
库该怎么做?还大概有代表方案么?

 

 

 回页首 
 

 

用正则表达式深入分析 XML

能够毫无疑问,纵然提到那些办法,有个别程序员也会放炮自个儿,但是真正能够用正则表明式解析XML。清单 4 呈现了选用 preg_ 函数读取图书文件的亲自过问。

 

清单 4. 用正则表达式读取 XML
  <?php
  $xml = “”;
  $f = fopen( ‘books.xml’, ‘r’ );
  while( $data = fread( $f, 4096 ) ) { $xml .= $data; }
  fclose( $f );
  
  preg_match_all( “/\<book\>(.*?)\<\/book\>/s”, 
  $xml, $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” );
  }
  ?>
 

请小心这些代码有多短。初叶时,它把文件读进三个大的字符串。然后用一个regex 函数读取各种图书品种。最终用 foreach
循环,在各种图书块间循环,并领收取 author、title 和 publisher。

那么,缺欠在哪呢?使用正则表明式代码读取 XML
的主题素材是,它并没先实行检查,确定保证 XML
的格式优异。那意味着在读取此前,不也许知晓 XML
是或不是格式卓绝。何况,有个别格式精确的 XML
大概与正则表明式不匹配,所以往来必须修改它们。

自家一向不提议接纳正则表达式读取
XML,不过一时它是包容性最棒的方式,因为正则表明式函数总是可用的。不要用正则表达式读取直接来源于用户的
XML,因为不恐怕调节那类 XML 的格式或结构。应当直接用 DOM 库或 SAX
解析器读取来自用户的 XML。

 

 

 回页首 
 

 

用 DOM 编写 XML

读取 XML 只是公式的一有的。该怎么编写 XML 呢?编写 XML 最佳的不二等秘书技便是用
DOM。清单 5 突显了 DOM 构建图书 XML 文件的格局。

 

清单 5. 用 DOM 编写图书 XML
  <?php
  $books = array();
  $books [] = array(
  ‘title’ => ‘PHP 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->saveXML();
  ?>
 

在剧本的顶上部分,用部分示范图书装入了 books
数组。那些数目足以来自用户也足以来自数据库。

示范图书装入之后,脚本创设三个 new DOMDocument,并把根节点 books
加多到它。然后脚本为每本书的 author、title 和 publisher
制造节点,并为每一个节点添Gavin本节点。每种 book
节点的末梢一步是再次把它增多到根节点 books。

剧本的终极用 saveXML 方法把 XML 输出到调控台。(也能够用 save
方法创制一个 XML 文件。)脚本的输出如清单 6 所示。

 

清单 6. DOM 营造脚本的出口
  % php e4.php 
  <?xml version=”1.0″?>
  <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>
  %
 

动用 DOM 的真正价值在于它创立的 XML 总是格式正确的。不过只要不可能用 DOM
创建 XML 时该怎么做?

 

 

 回页首 
 

 

用 PHP 编写 XML

万一 DOM 不可用,能够用 PHP 的文件模板编写 XML。清单 7 呈现了 PHP
怎么样创设图书 XML 文件。

 

清单 7. 用 PHP 编写图书 XML
  <?php
  $books = array();
  $books [] = array(
  ‘title’ => ‘PHP Hacks’,
  ‘author’ => ‘Jack Herrington’,
  ‘publisher’ => “O’Reilly”
  );
  $books [] = array(
  ‘title’ => ‘Podcasting Hacks’,
  ‘author’ => ‘Jack Herrington’,
  ‘publisher’ => “O’Reilly”
  );
  ?>
  <books>
  <?php
  
  foreach( $books as $book )
  {
  ?>
  <book>
  <title><?php echo( $book[‘title’] ); ?></title>
  <author><?php echo( $book[‘author’] ); ?>
  </author>
  <publisher><?php echo( $book[‘publisher’] ); ?>
  </publisher>
  </book>
  <?php
  }
  ?>
  </books>
 

本子的顶上部分与 DOM 脚本类似。脚本的后面部分展开 books
标识,然后在种种图书中迭代,创造 book 标识和颇具的里边 title、author 和
publisher 标志。

这种办法的主题材料是对实体实行编码。为了保障实体编码正确,必须在每一种品种上调用
htmlentities 函数,如清单 8 所示。

 

清单 8. 使用 htmlentities 函数对实业编码
 
  <books>
  <?php
  
  foreach( $books as $book )
  {
  $title = htmlentities( $book[‘title’], ENT_QUOTES );
  $author = htmlentities( $book[‘author’], ENT_QUOTES );
  $publisher = htmlentities( $book[‘publisher’], ENT_QUOTES );
  ?>
  <book>
  <title><?php echo( $title ); ?></title>
  <author><?php echo( $author ); ?> </author>
  <publisher><?php echo( $publisher ); ?>
  </publisher>
  </book>
  <?php
  }
  ?>
  </books>
 

那正是用基本的 PHP 编写 XML 的讨厌之处。您以为自身制造了到家的
XML,不过在妄想利用数据的时候,立即就能够意识有些因素的编码不正确。

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注