<?php $file = "xmltest.xml"; //驗證檔案的合法性 function trustedFile($file) { // only trust local files owned by ourselves if (!eregi("^([a-z]+)://", $file) && fileowner($file) == getmyuid()) { return true; } return false; } //處理起始標記的函數。用特殊顏色標記並輸出顯示。 //注意$attribs為數組 function startElement($parser, $name, $attribs=array() ) { print "<<font color="#0000cc">$name</font>"; if (sizeof($attribs)) { while (list($k, $v) = each($attribs)) { print " <font color="#009900">$k</font>="<font color="#990000">$v</font>""; } } print ">"; } //結束標記處理並顯示 function endElement($parser, $name) { print "</<font color="#0000cc">$name</font>>"; } //處理資料部分 function characterData($parser, $data) { print "<b>$data</b>"; } //處理指示(PI)處理器 參數處理函數 function PIHandler($parser, $target, $data) { switch (strtolower($target)) { case "php": global $parser_file; // If the parsed document is "trusted", we say it is safe // to execute PHP code inside it. If not, display the code // instead. if (trustedFile($parser_file[$parser])) { eval($data); } else { printf("Untrusted PHP code: <i>%s</i>", htmlspecialchars($data)); } break; } } //預設處理控制代碼 function defaultHandler($parser, $data) { if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {//判斷資料是否為外部實體,注意這種判斷方法。 printf('<font color="#aa00aa">%s</font>', htmlspecialchars($data)); } else { printf('<font size="-1">%s</font>', htmlspecialchars($data)); } } //外部實體處理控制代碼 function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId,$publicId) { if ($systemId) { if (!list($parser, $fp) = new_xml_parser($systemId)) { printf("Could not open entity %s at %sn", $openEntityNames, $systemId); return false; } while ($data = fread($fp, 4096)) { if (!xml_parse($parser, $data, feof($fp))) { printf("XML error: %s at line %d while parsing entity %sn", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser), $openEntityNames); xml_parser_free($parser); return false; } } xml_parser_free($parser); return true; } return false; } //xml分析器。 function new_xml_parser($file) { global $parser_file; $xml_parser = xml_parser_create(); //建立一個 XML 解析器,此函數返回解譯器的操作控制代碼。 xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); //設定是否採用大小寫摺疊,及目標編碼 xml_set_element_handler($xml_parser, "startElement", "endElement");//建立起始和終止元素處理器,bool xml_set_character_data_handler($xml_parser, "characterData");//建立字元資料處理器,bool xml_set_processing_instruction_handler($xml_parser, "PIHandler");//建立處理指示(PI)處理器 xml_set_default_handler($xml_parser, "defaultHandler"); //預設處理器 xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");//外部實體指向處理器 if (!($fp = @fopen($file, "r"))) { return false; } if (!is_array($parser_file)) { settype($parser_file, "array");//將檔案處理變數設為array類型 } $parser_file[$xml_parser] = $file; //?將檔案名稱賦值給以解譯器操作控制代碼為索引的數組?(解譯器的控制代碼以資源記錄的形式返回) // echo "<font color=red >parser = "; // print_r($parser_file); // echo "<br>$xml_parser"; // echo "</font>"; return array($xml_parser, $fp); //解譯器的操作控制代碼 和待分析檔案的控制代碼 } if (!(list($xml_parser, $fp) = new_xml_parser($file))) { die("could not open XML input"); } print "<pre>"; while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) {//此處採用條件賦值。當條件運算式失效時執行if處理,否則跳過。 die(sprintf("XML error: %s at line %dn", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } print "</pre>"; print "parse completen"; xml_parser_free($xml_parser); ?> xmltest.xml檔案 <?xml version="1.0" encoding="UTF-8" ?> <!--因為對xml瞭解不是很深,故將實體引用部分略去了 --> <chapter> <TITLE>Title </TITLE> <para> <informaltable> <tgroup cols="3"> <tbody> <row><entry>a1</entry><entry morerows="1">b1</entry><entry>c1</entry></row> <row><entry>a2</entry><entry>c2</entry></row> <row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row> </tbody> </tgroup> </informaltable> </para> <section id="about"> <title>About this Document</title> <para> <!-- this is a comment --> <?php print 'Hi! This is PHP version '.phpversion(); ?> </para> </section> </chapter> 還有一個是將xml檔案處理成php數組的例子。 <?php class AminoAcid { var $name; // aa name var $symbol; // three letter symbol var $code; // one letter code var $type; // hydrophobic, charged or neutral function AminoAcid ($aa) { foreach ($aa as $k=>$v) $this->$k = $aa[$k]; } } function readDatabase($filename) { // read the xml database of aminoacids $data = implode("",file($filename));//首先將整篇文章讀入數組,之後再將數組串連成字串,賦值給$data. $parser = xml_parser_create(); xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);//不使用大小寫摺疊 xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1); xml_parse_into_struct($parser,$data,$values,$tags);//將 XML 資料解析到數組中,該函數將 XML 檔案解析到兩個對應的數組中, //$tags 參數含有指向 $values 數組中對應值的指標。最後兩個數組參數可由指標傳遞給函數。 xml_parser_free($parser); // loop through the structures //針對具體的應用(不同的xml檔案,修改此處迴圈結構得到具體的數組即可。 foreach ($tags as $key=>$val) { if ($key == "molecule") { $molranges = $val; // each contiguous pair of array entries are the // lower and upper range for each molecule definition for ($i=0; $i < count($molranges); $i+=2) { $offset = $molranges[$i] + 1; $len = $molranges[$i + 1] - $offset; $tdb[] = parseMol(array_slice($values, $offset, $len)); } } else { continue; } } // echo "<font color=red>values is:"; // print_r($values); // echo "</font>"; return array($tdb,$values); } function parseMol($mvalues) { for ($i=0; $i < count($mvalues); $i++) $mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"]; // echo "<font color=blue> after parsemol :"; // print_r($mol); // echo "</font>"; return new AminoAcid($mol); } $db = readDatabase("moldb.xml"); echo "** Database of AminoAcid objects:n"; // echo "<font color=purple> readdatabase :"; print_r($db[0]); // echo "</font>"; $s = parseMol($db[1]); ?> 副 moldb.xml <?xml version="1.0" encoding="UTF-8" ?> <moldb> <molecule> <name>Alanine</name> <symbol>ala</symbol> <code>A</code> <type>hydrophobic</type> </molecule> <molecule> <name>Lysine</name> <symbol>lys</symbol> <code>K</code> <type>charged</type> </molecule> </moldb> |