用正则表达式解析 XML

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

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

 

  ?php

  $xml = "";

  $f = fopen( 'books.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" );

  }

  ?


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

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

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

 

DOM 编写 XML

 

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

 

 清单 5. DOM 编写图书 XML

 

  ?PHP

  $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 添加到它。然后脚本为每本书的 authortitle publisher 创建节点,并为每个节点添加文本节点。每个 book 节点的最后一步是重新把它添加到根节点 books

  脚本的末尾用 saveXML 方法把 XML 输出到控制台。(也可以用 save 方法创建一个 XML 文件。)脚本的输出如清单 6 所示。http://wenku.it168.com/d_000683419.shtml