php4/5使用Dom方式读取和解析和创建XML简单教程

今天CG做了一个简单的WP音乐播放器插件,其中涉及到使用PHP对XML文件的读取,解析和创建写入的功能,要求很多,整个开发过程做个教程应该足够了,CG自从上次修改了WP的部分源代码之后已近有好长时间没有写过php的程序,呵呵,有点生疏下面简单开始。



首先简单介绍一下XML(Extensible Markup Language),大家可以参阅 http://baike.baidu.com/view/63.htm



简单的说就是一种通用的多环境多用途的标记存储语言,现在使用和广泛,这里不多介绍,XML实质上就是存储起来的字符流,更高级一点就是可以读取的字符串流,但是因为XML定义了它的文档格式,因而可以在尊重这一个格式的条件下使用多种方法对XML中的数据进行存取,这种方式叫XML解析,通常XML有DOM,正则式,saxXpath等多种解析和访问方式,这里CG今天简单讲讲PHP的DOM解析方式。





下面是简单的XML演示Demo



<?xml version="1.0" encoding="UTF-8" ?>


<!--a demo music list for freeware-->


 <playlist version="1" xmlns="http://xspf.org/ns/0/">


  <title>XSPF Playlist</title>


  <info>#</info>


  <trackList>


   <track>


     <annotation>Demo: Yanni - With An Orchid</annotation>


     <location>http://XXXX/WithanOrchid.Wma</location>


     <info></info>


   </track>


   <track>


     <annotation>Demo: Yanni - Ninghtingale</annotation>


     <location>http://XXXX/Ninghtingale.Wma</location>


     <info></info>


   </track>


  </trackList>


 </playlist>




需求1:获取trackList中所有track的annotation,location,info子节点的值。跟JS类似,获取所有track名称的Tag为数组,然后就是遍历一遍,因为要获取track下面的子节点的信息,不妨在遍历一遍track,因为格式固定,所以可以找到对应索引节点中的nodeValue就可以了。

源代码:

PHP5:

//PHP5

$tracks = array();

$playlistfile = 'XML File Path'; //XML File Path



$playlistdom = new DOMDocument('1.0','utf-8');

if (!$playlistdom->loadXML(file_get_contents($playlistfile)))

{

echo "Error while parsing the documentn";

exit;

}



$items = $playlistdom->getElementsByTagName('track');



foreach ($items as $item)

{

$annotation =$item->getElementsByTagName('annotation');

$location =$item->getElementsByTagName('location');

$info =$item->getElementsByTagName('info');

$tracks[]=array(

'annotation' => $annotation->item(0)->nodeValue,

'location' => $location->item(0)->nodeValue,

'info' => $info->item(0)->nodeValue );

}

print_r($tracks);


PHP4:

//PHP4

$tracks = array();

$playlistfile = 'XML File Path'; //XML File Path



if (!$playlistdom = domxml_open_file($playlistfile)) {

echo "Error while parsing the documentn";

exit;

}



$items = $playlistdom->get_elements_by_tagname('track');

foreach ($items as $item)

{

$annotation =$item->get_elements_by_tagname('annotation');

$location =$item->get_elements_by_tagname('location');

$info =$item->get_elements_by_tagname('info');

$tracks[]=array(

'title' => $annotation->item(0)->node_value,

'path' =>$location->item(0)->node_value

'info' => $info->item(0)->node_value );

}

print_r($tracks);


需求2:提供一个track数组,要求创建一个XML Dom对象。这里关键是对对象的遍历的过程的,需要从顶向下遍历这个对象然后依次创建Element,然后就是将Element中createTextNode设置它的值,最后记得appendChild到它的父节点就可以了。

源代码:

PHP5:

//PHP5

$tracks=Array();//tracks

$listdoc = new DOMDocument('1.0','UTF-8');

$listroot = $listdoc->createElement('playlist');

$listdoc->appendChild($listroot);

$listtitle = $listdoc->createElement('title');

$listtitle->appendChild($listdoc->createTextNode('XSPF Playlist'));

$listroot->appendChild($listtitle);

$listinfo = $listdoc->createElement('info');

$listinfo->appendChild($listdoc->createTextNode('#'));

$listroot->appendChild($listinfo);

$listtracklist = $listdoc->createElement('trackList');

$listroot->appendChild($listtracklist);

foreach ( $tracks as $track)

{

$nodetrack = $listdoc->createElement('track');

$nodeannotation = $listdoc->createElement('annotation');

$nodeannotation -> appendChild($listdoc->createTextNode($track['title']));

$nodetrack -> appendChild($nodeannotation);



$nodelocation = $listdoc->createElement('location');

$nodelocation -> appendChild($listdoc->createTextNode($track['path']));

$nodetrack -> appendChild($nodelocation);



$nodeinfo = $listdoc->createElement('info');

$nodeinfo -> appendChild($listdoc->createTextNode('#'));

$nodetrack -> appendChild($nodeinfo);

$nodetrack = $listtracklist->appendChild($nodetrack);

}


PHP4:


//PHP4

$tracks=Array();//tracks

$listdoc = domxml_new_doc('1.0');



$listroot = $listdoc->create_element('playlist');

$listdoc->append_child($listroot);

$listtitle = $listdoc->create_element('title');

$listtitle->append_child($listdoc->create_text_node('XSPF Playlist'));

$listroot->append_child($listtitle);

$listinfo = $listdoc->create_element('info');

$listinfo->append_child($listdoc->create_text_node('#'));

$listroot->append_child($listinfo);

$listtracklist = $listdoc->create_element('trackList');

$listroot->append_child($listtracklist);

foreach ( $tracks as $track)

{

$nodetrack = $listdoc->create_element('track');

$nodeannotation = $listdoc->create_element('annotation');

$nodeannotation -> append_child($listdoc->create_text_node($track['title']));

$nodetrack -> append_child($nodeannotation);



$nodelocation = $listdoc->create_element('location');

$nodelocation -> append_child($listdoc->create_text_node($track['path']));

$nodetrack -> append_child($nodelocation);



$nodeinfo = $listdoc->create_element('info');

$nodeinfo -> append_child($listdoc->create_text_node('#'));

$nodetrack -> append_child($nodeinfo);

$nodetrack = $listtracklist->append_child($nodetrack);

}


需求3:将PHP生成的XML Dom写入文件。

这个跟一般PHP写入文件类似,但是有两个比较重要的方法PHP下的SaveXML()和PHP4下的html_dump_mem();SaveXML是DomDocument对象的方法,这个很好理解,但是在PHP4下面,XML对象是当成HTML来处理的,所以用了一个大家以前处理HTML的方法html_dump_mem,由于XML>HTML,所以可以兼容。

源代码:

PHP5:

  $dom = DOMDocument(); //DOM

$fileName = 'target FileName' ; //FileName

$domFile = fopen($fileName,'w');

if(!$domFile)

{

echo 'File open Error';

exit;

}

fwrite($domFile, $dom->SaveXML());

fclose($domFile);


PHP4:

  $dom = dom_xml(); //DOM,注意PHP4中没有dom_xml这个对象,$dom的实质是数组

$fileName = 'target FileName' ; //FileName

$domFile = fopen($fileName,'w');

if(!$domFile)

{

echo 'File open Error';

exit;

}

fwrite($domFile, $dom->html_dump_mem());

fclose($domfile);

--------------------------------------------------------------------------------------
- 版权声明:
- 如在本页面内无特别说明,本文内容均为[李大仁博客]原创,本文版权归[李大仁博客]所有。
- 欢迎转载,转载请务必在文章页面明显位置提供原文链接并注明出处。欢迎您在转载本文时保留本段声明。
- 文章标题: [PHP]php4/5下使用Dom方式读取和解析和创建XML简单教程
- 独立博客: 李大仁博客
- 永久链接:http://www.lidaren.com/archives/487
--------------------------------------------------------------------------------------
以上内容由博客自动发布工具自动发布,最终显示内容和效果会与原文内容有所偏差,敬请谅解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值