用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获取地址栏信息的代码
Oct 08 PHP
php 正则匹配函数体
Aug 25 PHP
10个可以简化php开发过程的MySQL工具
Apr 11 PHP
window+nginx+php环境配置 附配置搭配说明
Dec 29 PHP
非常好用的两个PHP函数 serialize()和unserialize()
Feb 04 PHP
解析php时间戳与日期的转换
Jun 06 PHP
解析php中memcache的应用
Jun 18 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
Jun 23 PHP
php基本函数汇总
Jul 09 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
Nov 17 PHP
yii2中使用Active Record模式的方法
Jan 09 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 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执行速度全攻略(上)
2006/10/09 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
js获取事件源及触发该事件的对象
2013/10/24 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
Python中.py文件打包成exe可执行文件详解
2017/03/22 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
python内置模块collections知识点总结
2019/12/19 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
pytorch数据预处理错误的解决
2020/02/20 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
办公室内勤工作职责
2013/12/11 职场文书
新春寄语大全
2014/04/09 职场文书
团日活动总结报告
2014/06/25 职场文书
高中开学感言
2015/08/01 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技