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

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-&gt;loadXML(file_get_contents($playlistfile)))
  {
    echo "Error while parsing the documentn";
    exit;
  }
 
  $items = $playlistdom-&gt;getElementsByTagName('track');
 
  foreach ($items as $item)
  {
  $annotation =$item-&gt;getElementsByTagName('annotation');
  $location =$item-&gt;getElementsByTagName('location');
  $info =$item-&gt;getElementsByTagName('info');
    $tracks[]=array(
      'annotation' =&gt; $annotation-&gt;item(0)-&gt;nodeValue,
      'location' =&gt; $location-&gt;item(0)-&gt;nodeValue,
      'info' =&gt; $info-&gt;item(0)-&gt;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-&gt;get_elements_by_tagname('track');
  foreach ($items as $item)
  {
    $annotation =$item-&gt;get_elements_by_tagname('annotation');
    $location =$item-&gt;get_elements_by_tagname('location');
    $info =$item-&gt;get_elements_by_tagname('info');
    $tracks[]=array(
      'title' =&gt; $annotation-&gt;item(0)-&gt;node_value,
      'path' =&gt;$location-&gt;item(0)-&gt;node_value
      'info' =&gt; $info-&gt;item(0)-&gt;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-&gt;createElement('playlist');
  $listdoc-&gt;appendChild($listroot);
  $listtitle = $listdoc-&gt;createElement('title');
  $listtitle-&gt;appendChild($listdoc-&gt;createTextNode('XSPF Playlist'));
  $listroot-&gt;appendChild($listtitle);
  $listinfo = $listdoc-&gt;createElement('info');
  $listinfo-&gt;appendChild($listdoc-&gt;createTextNode('#'));
  $listroot-&gt;appendChild($listinfo);
  $listtracklist = $listdoc-&gt;createElement('trackList');
  $listroot-&gt;appendChild($listtracklist);
  foreach ( $tracks as $track)
  {
    $nodetrack = $listdoc-&gt;createElement('track');
      $nodeannotation = $listdoc-&gt;createElement('annotation');
      $nodeannotation -&gt; appendChild($listdoc-&gt;createTextNode($track['title']));
      $nodetrack -&gt; appendChild($nodeannotation);
 
      $nodelocation = $listdoc-&gt;createElement('location');
      $nodelocation -&gt; appendChild($listdoc-&gt;createTextNode($track['path']));
      $nodetrack -&gt; appendChild($nodelocation);
 
      $nodeinfo = $listdoc-&gt;createElement('info');
      $nodeinfo -&gt; appendChild($listdoc-&gt;createTextNode('#'));
      $nodetrack -&gt; appendChild($nodeinfo);
    $nodetrack = $listtracklist-&gt;appendChild($nodetrack);
  }
PHP4:
//PHP4
  $tracks=Array();//tracks
  $listdoc = domxml_new_doc('1.0');
 
  $listroot = $listdoc-&gt;create_element('playlist');
  $listdoc-&gt;append_child($listroot);
  $listtitle = $listdoc-&gt;create_element('title');
  $listtitle-&gt;append_child($listdoc-&gt;create_text_node('XSPF Playlist'));
  $listroot-&gt;append_child($listtitle);
  $listinfo = $listdoc-&gt;create_element('info');
  $listinfo-&gt;append_child($listdoc-&gt;create_text_node('#'));
  $listroot-&gt;append_child($listinfo);
  $listtracklist = $listdoc-&gt;create_element('trackList');
  $listroot-&gt;append_child($listtracklist);
  foreach ( $tracks as $track)
  {
    $nodetrack = $listdoc-&gt;create_element('track');
      $nodeannotation = $listdoc-&gt;create_element('annotation');
      $nodeannotation -&gt; append_child($listdoc-&gt;create_text_node($track['title']));
      $nodetrack -&gt; append_child($nodeannotation);
 
      $nodelocation = $listdoc-&gt;create_element('location');
      $nodelocation -&gt; append_child($listdoc-&gt;create_text_node($track['path']));
      $nodetrack -&gt; append_child($nodelocation);
 
      $nodeinfo = $listdoc-&gt;create_element('info');
      $nodeinfo -&gt; append_child($listdoc-&gt;create_text_node('#'));
      $nodetrack -&gt; append_child($nodeinfo);
    $nodetrack = $listtracklist-&gt;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-&gt;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-&gt;html_dump_mem());
  fclose($domfile);
Categories: 语言编程 Tags: ,
  1. August 24th, 2009 at 15:07 | #1

    吐血了,PHP你也会?!

  1. September 23rd, 2009 at 21:11 | #1
You must be logged in to post a comment.