用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 相关文章推荐
数字转英文
Dec 06 PHP
加速XP搜索功能堪比vista
Mar 22 PHP
php 全局变量范围分析
Aug 07 PHP
PHP下escape解码函数的实现方法
Aug 08 PHP
php循环检测目录是否存在并创建(循环创建目录)
Jan 06 PHP
分享8个最佳的代码片段在线测试网站
Jun 29 PHP
PHP中的类型提示(type hinting)功能介绍
Jul 01 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
Dec 17 PHP
PHP会员找回密码功能的简单实现
Sep 05 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
Nov 28 PHP
PHP性能分析工具xhprof的安装使用与注意事项
Dec 19 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
Sep 13 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和AJAX创建RSS聚合器的代码
2007/03/13 PHP
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
PHP面向对象详解(三)
2015/12/07 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
javascript性能优化之事件委托实例详解
2015/12/12 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
详解nodejs express下使用redis管理session
2017/04/24 NodeJs
使用Browserify来实现CommonJS的浏览器加载方法
2017/05/14 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
详解Node 定时器
2018/02/26 Javascript
详解Vue的组件中data选项为什么必须是函数
2020/08/17 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
Python Web框架Flask中使用七牛云存储实例
2015/02/08 Python
python获取mp3文件信息的方法
2015/06/15 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
护理专业优质毕业生自荐书
2014/01/31 职场文书
学校十一活动方案
2014/02/01 职场文书
小学教师培训感言
2014/02/11 职场文书
生物制药专业自我鉴定
2014/02/19 职场文书
保护动物倡议书
2014/04/15 职场文书
法定代表人授权委托书范文
2014/08/02 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
2015年电教工作总结
2015/05/26 职场文书