pear中几个实用的xml代码库
1.XML_Beautifier
用于将一段排版凌乱的XML文档美化
1 <?php 2 require_once "XML/Beautifier.php"; 3 $fmt = new XML_Beautifier(); 4 $result = $fmt->formatFile('originalFile.xml', 'beautifiedFile.xml'); 5 if (PEAR::isError($result)) { 6 echo $result->getMessage(); 7 exit(); 8 } 9 echo "File beautified, awaiting orders!<br />"; 10 ?>
2.XML_DTD
引用外部的dtd文件以对xml内容进行验证
1 <?php 2 require_once 'XML/DTD/XmlValidator.php'; 3 $dtd_file = realpath('myfile.dtd'); 4 $xml_file = realpath('myfile.xml'); 5 $validator = new XML_DTD_XmlValidator(); 6 if (!$validator->isValid($dtd_file, $xml_file)) { 7 die($validator->getMessage()); 8 } 9 ?>
3.XML_Feed_Parser
解析各种主流格式的Feed(xml,atom,rss1,rss2等格式)
1 <?php 2 /* The file you wish to parse */ 3 $source = 'my_source.xml'; 4 /* Where Relax NG is available, we can force validation of the feed */ 5 $validate = true; 6 /* Whether or not to suppress non-fatal warnings */ 7 $suppress_warnings = false; 8 /* If the feed is not valid XML and the tidy extension is installed we can * attempt to use it to fix the feed */ 9 $use_tidy = true; 10 $feed = new XML_Feed_Parser($source, $validate, $suppress_warnings, $use_tidy); 11 foreach ($feed as $entry) { 12 print $entry->title . "\n"; 13 } 14 $first_entry = $feed->getEntryByOffset(0); 15 $particular_entry = $feed->getEntryById('http://jystewart.net/entry/1'); 16 ?>
4.XML_Parser
SAX模型的 XML 解析器,相对于DOM解析器在解析时需要将这个xml树加载到内存中,SAX在某些应用中表现的更加轻量级。
1 <?php 2 require_once 'XML/Parser.php'; 3 class myParser extends XML_Parser { 4 function myParser() { 5 parent::XML_Parser(); 6 } 7 /** * 处理起始标签 * * @access private * @param resource xml parser 句柄 * @param string 标签名 * @param array 属性值 */ 8 function startHandler($xp, $name, $attribs) { 9 printf('handle start tag: %s<br />', $name); 10 } 11 /** * 处理结束标签 * * @access private * @param resource xml parser 句柄 * @param string 标签名 */ 12 function endHandler($xp, $name) { 13 printf('handle end tag: %s<br />', $name); 14 } 15 /** * 处理字符数据 * * @access private * @param resource xml parser 句柄 * @param string 字符数据 */ 16 function cdataHandler($xp, $cdata) { 17 // does nothing here, but might e.g. print $cdata 18 } 19 } 20 21 $p = &new myParser(); 22 $result = $p->setInputFile('xml_parser_file.xml'); 23 $result = $p->parse(); 24 ?>
5.XML_Query2XML
实用query语句直接从数据库中调取数据并转换成XML(支持PDO, PEAR MDB2, PEAR DB, ADOdb)
1 <?php 2 require_once 'XML/Query2XML.php'; 3 $pdo = new PDO('mysql://root@localhost/Query2XML_Tests'); 4 $query2xml = XML_Query2XML::factory($pdo); 5 $artistid = $_REQUEST['artistid']; 6 $dom = $query2xml->getXML( 7 array( 8 'data' => array( 9 ":$artistid" 10 ), 11 'query' => 'SELECT * FROM artist WHERE artistid = ?' 12 ), 13 array( 14 'rootTag' => 'favorite_artist', 15 'idColumn' => 'artistid', 16 'rowTag' => 'artist', 17 'elements' => array( 18 'name', 19 'birth_year', 20 'music_genre' => 'genre' 21 ) 22 ) 23 ); 24 header('Content-Type: application/xml'); 25 $dom->formatOutput = true; 26 print $dom->saveXML(); 27 ?>
6.XML_RDDL
读取资源目录描述语言(Resource Directory Description Language,RDDL)
1 <?php 2 require_once "XML/RDDL.php"; 3 4 // create new RDDL parser 5 $rddl = &new XML_RDDL(); 6 7 // parse a document that contains RDDL resources 8 $result = $rddl->parseRDDL('http://www.rddl.org'); 9 // check for error 10 if (PEAR::isError($result)) { 11 echo sprintf( "ERROR: %s (code %d)", $result->getMessage(), $result->getCode()); 12 exit; 13 } 14 15 // get all resources 16 $resources = $rddl->getAllResources(); 17 echo "<pre>"; 18 print_r($resources); 19 echo "</pre>"; 20 21 // get one resource by its Id 22 $test = $rddl->getResourceById('CSS'); 23 echo "<pre>"; 24 print_r($test); 25 echo "</pre>"; 26 27 // get all stylesheets 28 $test = $rddl->getResourcesByNature('http://www.w3.org/1999/XSL/Transform'); 29 echo "<pre>"; 30 print_r($test); 31 echo "</pre>"; 32 33 // get all normative references 34 $test = $rddl->getResourcesByPurpose('http://www.rddl.org/purposes#normative-reference'); 35 echo "<pre>"; 36 print_r($test); 37 echo "</pre>"; 38 ?>
7.XML_RSS
RSS解析器
1 <?php 2 require_once "XML/RSS.php"; 3 4 $rss =& new XML_RSS("http://rss.slashdot.org/Slashdot/slashdot"); 5 $rss->parse(); 6 7 echo "<h1>Headlines from <a href=\"http://slashdot.org\">Slashdot</a></h1>\n"; 8 echo "<ul>\n"; 9 10 foreach ($rss->getItems() as $item) { 11 echo "<li><a href=\"" . $item['link'] . "\">" . $item['title'] . "</a></li>\n"; 12 } 13 14 echo "</ul>\n"; 15 ?>
8.XML_Serializer
XML生成器
1 <?php 2 require_once 'XML/Serializer.php'; 3 4 $options = array( 5 "indent" => " ", 6 "linebreak" => "\n", 7 "typeHints" => false, 8 "addDecl" => true, 9 "encoding" => "UTF-8", 10 "rootName" => "rdf:RDF", 11 "defaultTagName" => "item" 12 ); 13 14 $stories[] = array( 15 'title' => 'First Article', 16 'link' => 'http://freedomink.org/node/view/55', 17 'description' => 'Short blurb about article........' 18 ); 19 20 $stories[] = array( 21 'title' => 'Second Article', 22 'link' => 'http://freedomink.org/node/view/11', 23 'description' => 'This article shows you how ......' 24 ); 25 26 $data['channel'] = array( 27 "title" => "Freedom Ink", 28 "link" => "http://freedomink.org/", 29 $stories 30 ); 31 32 $serializer = new XML_Serializer($options); 33 34 if ($serializer->serialize($data)) { 35 header('Content-type: text/xml'); 36 echo $serializer->getSerializedData(); 37 } 38 ?>
9.XML_sql2xml
通过sql语句直接从数据库中调取数据转化成xml
1 <?php 2 require_once "XML/sql2xml.php"; 3 $sql2xmlclass = new xml_sql2xml("mysql://username:password@localhost/xmltest"); 4 $xmlstring = $sql2xmlclass->getxml("select * from bands"); 5 ?>
10.XML_Statistics
XML数据统计,标签个数,结构深度等,相当好用
1 <?php 2 require_once "XML/Statistics.php"; 3 $stat = new XML_Statistics(array("ignoreWhitespace" => true)); 4 $result = $stat->analyzeFile("example.xml"); 5 6 if ($stat->isError($result)) { 7 die("Error: " . $result->getMessage()); 8 } 9 10 // total amount of tags: 11 echo "Total tags: " . $stat->countTag() . "<br />"; 12 13 // count amount of 'title' attribute, in all tags 14 echo "Occurences of attribute title: " . $stat->countAttribute("title") . "<br />"; 15 16 // count amount of 'title' attribute, only in <section> tags 17 echo "Occurences of attribute title in tag section: " . $stat->countAttribute("title", "section") . "<br />"; 18 19 // count total number of tags in depth 4 20 echo "Amount of Tags in depth 4: " . $stat->countTagsInDepth(4) . "<br />"; 21 22 echo "Occurences of PHP Blocks: " . $stat->countPI("PHP") . "<br />"; 23 24 echo "Occurences of external entity 'bar': " . $stat->countExternalEntity("bar") . "<br />"; 25 26 echo "Data chunks: " . $stat->countDataChunks() . "<br />"; 27 28 echo "Length of all data chunks: " . $stat->getCDataLength() . "<br />";