用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 和 HTML
Oct 09 PHP
如何正确理解PHP的错误信息
Oct 09 PHP
mysql limit查询优化分析
Nov 12 PHP
PHP Ajax中文乱码问题解决方法
Feb 27 PHP
PHP判断JSON对象是否存在的方法(推荐)
Jul 06 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
Nov 14 PHP
PHP编程获取各个时间段具体时间的方法
May 26 PHP
java解析json方法总结
May 16 PHP
laravel 实现登陆后返回登陆前的页面方法
Oct 03 PHP
PHP程序员必须知道的两种日志实例分析
May 14 PHP
phpmyadmin在宝塔面板里进不去的解决方案
Jul 06 PHP
PHP替换Word中变量并导出PDF图片的实现方法
Nov 26 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
提高代码性能技巧谈—以创建千行表格为例
2006/07/01 Javascript
javascript实现轮显新闻标题链接
2007/08/13 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
node.js express安装及示例网站搭建方法(分享)
2016/08/22 Javascript
微信小程序 五星评分的实现实例
2017/08/04 Javascript
详解用函数式编程对JavaScript进行断舍离
2017/09/18 Javascript
深入理解Vue keep-alive及实践总结
2019/08/21 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
javascript实现蒙版与禁止页面滚动
2020/01/11 Javascript
vue-cli设置css不生效的解决方法
2020/02/07 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
[03:41]2018完美盛典-《Fight With Us》
2018/12/16 DOTA
Django验证码的生成与使用示例
2017/05/20 Python
多版本Python共存的配置方法
2017/05/22 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
python 检查文件mime类型的方法
2018/12/08 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
5 分钟读懂Python 中的 Hook 钩子函数
2020/12/09 Python
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
能源工程专业应届生求职信
2014/03/01 职场文书
探亲假请假条
2014/04/11 职场文书
驾驶员安全责任书
2014/07/22 职场文书
意外伤害赔偿协议书
2014/09/16 职场文书
企业授权委托书范本
2014/09/22 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
三下乡个人总结
2015/03/04 职场文书
公司搬迁通知
2015/04/20 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
原生JS实现分页
2022/04/19 Javascript
mysql中关键词exists的用法实例详解
2022/06/10 MySQL