用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 相关文章推荐
Win9x/ME下Apache+PHP安装配置
Oct 09 PHP
php zlib压缩和解压缩swf文件的代码
Dec 30 PHP
php 将excel导入mysql
Nov 09 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
Dec 17 PHP
php实现约瑟夫问题的方法小结
Mar 23 PHP
使用新浪微博API的OAuth认证发布微博实例
Mar 27 PHP
php实现中文字符截取防乱码方法汇总
Apr 29 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
May 18 PHP
php使用crypt()函数进行加密
Jun 08 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
Oct 16 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 23 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 register_globals 值为on与off的理解
2013/09/26 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/03 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
2019/09/20 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
详解Python中expandtabs()方法的使用
2015/05/18 Python
python中使用print输出中文的方法
2018/07/16 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
python修改FTP服务器上的文件名
2019/09/11 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
python3 简单实现组合设计模式
2020/07/02 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
印度首个本地在线平台:nearbuy
2019/03/28 全球购物
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
座谈会主持词
2014/03/20 职场文书
元宵节寄语大全
2015/02/27 职场文书
2015年驾驶员工作总结
2015/04/29 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
阿里云日志过滤器配置日志服务
2022/04/09 Servers