建站学 - 轻松建站从此开始!

建站学-个人建站指南,网页制作,网站设计,网站制作教程

当前位置: 建站学 > 网站开发 > PHP教程 >

用PHP读取和编写XML及DOM(3)

时间:2010-09-16 00:48来源: 作者: 点击:
用正则表达式解析XML 可以肯定,即使提到这个方法,有些工程师也会批评我,但是确实可以用正则表达式解析 XML。清单 4 显示了使用 preg_ 函数读取图书文件的示例。 清单 4. 用正则表达式读取XML ? php $ xml = ; $

用正则表达式解析XML

可以肯定,即使提到这个方法,有些工程师也会批评我,但是确实可以用正则表达式解析 XML。清单 4 显示了使用 preg_ 函数读取图书文件的示例。

清单 4. 用正则表达式读取XML

  1. <?php 
  2. $xml = "";  
  3. $f = fopen( 'books.xml', 'r' );  
  4. while( $data = fread( $f, 4096 ) ) { $xml .= $data; }  
  5. fclose( $f );  
  6.  
  7. preg_match_all( "/\<book\>(.*?)\<\/book\>/s",   
  8. $xml, $bookblocks );  
  9.  
  10. foreach( $bookblocks[1] as $block )  
  11. {  
  12. preg_match_all( "/\<author\>(.*?)\<\/author\>/",   
  13. $block, $author );  
  14. preg_match_all( "/\<title\>(.*?)\<\/title\>/",   
  15. $block, $title );  
  16. preg_match_all( "/\<publisher\>(.*?)\<\/publisher\>/",   
  17. $block, $publisher );  
  18. echo( $title[1][0]." - ".$author[1][0]." - ".  
  19. $publisher[1][0]."\n" );  
  20. }  
  21. ?> 

请注意这个代码有多短。开始时,它把文件读进一个大的字符串。然后用一个 regex 函数读取每个图书项目。最后用 foreach 循环,在每个图书块间循环,并提取出 author、title 和 publisher。

那么,缺陷在哪呢?使用正则表达式代码读取 XML 的问题是,它并没先进行检查,确保 XML 的格式良好。这意味着在读取之前,无法知道 XML 是否格式良好。而且,有些格式正确的 XML 可能与正则表达式不匹配,所以日后必须修改它们。

我从不建议使用正则表达式读取 XML,但是有时它是兼容性最好的方式,因为正则表达式函数总是可用的。不要用正则表达式读取直接来自用户的 XML,因为无法控制这类 XML 的格式或结构。应当一直用 DOM 库或 SAX 解析器读取来自用户的 XML。

用DOM编写XML

读取 XML 只是公式的一部分。该怎样编写 XML 呢?编写 XML 最好的方式就是用 DOM。清单 5 显示了 DOM 构建图书 XML 文件的方式。

清单 5. 用DOM编写图书XML

  1. <?php 
  2. $books = array();  
  3. $books [] = array(  
  4. 'title' => 'PHP Hacks',  
  5. 'author' => 'Jack Herrington',  
  6. 'publisher' => "O'Reilly"  
  7. );  
  8. $books [] = array(  
  9. 'title' => 'Podcasting Hacks',  
  10. 'author' => 'Jack Herrington',  
  11. 'publisher' => "O'Reilly"  
  12. );  
  13.  
  14. $doc = new DOMDocument();  
  15. $doc->formatOutput = true;  
  16.  
  17. $r = $doc->createElement( "books" );  
  18. $doc->appendChild( $r );  
  19.  
  20. foreach( $books as $book )  
  21. {  
  22. $b = $doc->createElement( "book" );  
  23.  
  24. $author = $doc->createElement( "author" );  
  25. $author->appendChild(  
  26. $doc->createTextNode( $book['author'] )  
  27. );  
  28. $b->appendChild( $author );  
  29.  
  30. $title = $doc->createElement( "title" );  
  31. $title->appendChild(  
  32. $doc->createTextNode( $book['title'] )  
  33. );  
  34. $b->appendChild( $title );  
  35.  
  36. $publisher = $doc->createElement( "publisher" );  
  37. $publisher->appendChild(  
  38. $doc->createTextNode( $book['publisher'] )  
  39. );  
  40. $b->appendChild( $publisher );  
  41.  
  42. $r->appendChild( $b );  
  43. }  
  44.  
  45. echo $doc->saveXML();  
  46. ?> 

在脚本的顶部,用一些示例图书装入了 books 数组。这个数据可以来自用户也可以来自数据库。

示例图书装入之后,脚本创建一个 new DOMDocument,并把根节点 books 添加到它。然后脚本为每本书的 author、title 和 publisher 创建节点,并为每个节点添加文本节点。每个 book 节点的最后一步是重新把它添加到根节点 books。脚本的末尾用 saveXML 方法把 XML 输出到控制台。(也可以用 save 方法创建一个 XML 文件。)脚本的输出如清单 6 所示。

清单6. DOM构建脚本的输出

  1. % php e4.php   
  2. <?xml version="1.0"?> 
  3. <books> 
  4. <book> 
  5. <author>memory Herrington</author> 
  6. <title>PHP memory</title> 
  7. <publisher>O'Reilly</publisher> 
  8. </book> 
  9. <book> 
  10. <author>memory Herrington</author> 
  11. <title>Podcasting Hacks</title> 
  12. <publisher>O'Reilly</publisher> 
  13. </book> 
  14. </books> 

使用 DOM 的真正价值在于它创建的 XML 总是格式正确的。但是如果不能用 DOM 创建 XML 时该怎么办?

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片