用PHP实现读取和编写XML DOM代码


Posted in PHP onApril 07, 2010
// 用 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>”; 
}

/*
脚本首先创建一个 new DOMdocument 对象,用 load 方法把图书 XML 装入这个对象。之后,脚本 用 getElementsByName 方法得到指定名称下的所有元素的列表。
在 book 节点的循环中,脚本用 getElementsByName 方法获得 author、 publisher 和 title 标记的 nodeValue。nodeValue 是节点中的文本。脚本然后显示这些值。
*/
// 用 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”; 
}

/*
脚本首先设置 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
$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” ); 
}

/*
我从不建议使用正则表达式读取 XML,但是有时它是兼容性最好的方式,因为正则表达式函数总是可用的。不要用正则表达式读取直接来自用户 的 XML,因为无法控制这类 XML 的格式或结构。应当一直用 DOM 库或 SAX 解析器读取来自用户的 XML。
*/
// 用 DOM 编写 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” 
); 
$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 创建节点,并为每个节点添加文本节点。每个 book 节点的最后一步是重新把它添加到根节 点 books。
使用 DOM 的真正价值在于它创建的 XML 总是格式正确的。但是如果不能用 DOM 创建 XML 时该怎么办?
Xml代码
<?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>

实例中用到的 test.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>
PHP 相关文章推荐
PHP 上传文件的方法(类)
Jul 30 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
深入php socket的讲解与实例分析
Jun 13 PHP
解析php中curl_multi的应用
Jul 17 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
Sep 24 PHP
php之curl实现http与https请求的方法
Oct 21 PHP
thinkphp微信开发(消息加密解密)
Dec 02 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
Mar 18 PHP
Yii CGridView用法实例详解
Jul 12 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
详细解读php的命名空间(一)
Feb 21 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 PHP
php session和cookie使用说明
Apr 07 #PHP
DedeCMS dede_channeltype表字段注释
Apr 07 #PHP
php抓取https的内容的代码
Apr 06 #PHP
php中几种常见安全设置详解
Apr 06 #PHP
PHP 检查扩展库或函数是否可用的代码
Apr 06 #PHP
php下关于中英数字混排的字符串分割问题
Apr 06 #PHP
Blitz templates 最快的PHP模板引擎
Apr 06 #PHP
You might like
数据库查询记录php 多行多列显示
2009/08/15 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
PHP 5.6.11中CURL模块问题的解决方法
2016/08/08 PHP
php自定义时间转换函数示例
2016/12/07 PHP
php命令行写shell实例详解
2018/07/19 PHP
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成&quot;...&quot;)
2016/11/28 Javascript
nodejs 实现钉钉ISV接入的加密解密方法
2017/01/16 NodeJs
详解vue axios二次封装
2018/07/22 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
python实现浪漫的烟花秀
2019/01/30 Python
python实现小球弹跳效果
2019/05/10 Python
python脚本后台执行方式
2019/12/21 Python
Python常用外部指令执行代码实例
2020/11/05 Python
MoviePy常用剪辑类及Python视频剪辑自动化
2020/12/18 Python
纯CSS实现聊天框小尖角、气泡效果
2014/04/04 HTML / CSS
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
不用游标的SQL语句有哪些
2012/09/07 面试题
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
公司周年庆典标语
2014/10/07 职场文书
黑白记忆观后感
2015/06/18 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers