用正则表达式解析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 循环,在每个图书块间循环,并提取出 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
- <?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 添加到它。然后脚本为每本书的 author、title 和 publisher 创建节点,并为每个节点添加文本节点。每个 book 节点的最后一步是重新把它添加到根节点 books。脚本的末尾用 saveXML 方法把 XML 输出到控制台。(也可以用 save 方法创建一个 XML 文件。)脚本的输出如清单 6 所示。
清单6. DOM构建脚本的输出
- % php e4.php
- <?xml version="1.0"?>
- <books>
- <book>
- <author>memory Herrington</author>
- <title>PHP memory</title>
- <publisher>O'Reilly</publisher>
- </book>
- <book>
- <author>memory Herrington</author>
- <title>Podcasting Hacks</title>
- <publisher>O'Reilly</publisher>
- </book>
- </books>
- %
使用 DOM 的真正价值在于它创建的 XML 总是格式正确的。但是如果不能用 DOM 创建 XML 时该怎么办?
(责任编辑:admin) |