国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP 處理XML文件實例詳解

2024-05-04 21:58:36
字體:
來源:轉載
供稿:網友

XML的精髓是什么呢?

就是我們基于信息描述的,能夠體現數據信息之間邏輯關系的,可以確保文件的易讀性和易搜索性的自定義標記.

你的XML文件遵循所謂“形式良好”要求的種種語法規則,一個完全意義上的XML文件不僅應該是“形式良好的”,而且還應該是使用了這些自定義標記的“有效”的XML文件.

一個XML文件必須遵守文件類型描述DTD(Document Type Definition)中定義的種種規定,DTD實際上是“元標記”這個概念的產物,它描述了一個標記語言的語法和詞匯表,也就是定義了文件的整體結構以及文件的語法,簡而言之,DTD規定了一個語法分析器為了解釋一個“有效的”XML文件所需要知道的所有規則的細節.

如何寫一個XML文件

1. 第一個行<?xml version="1.0" ?>

2. 必須有一個最外層的標記

3. XML標記不區分大小寫,使用中文都可以,開始標記是什么,結束就必須是什么

4. 所有的XML標記必須有結束

5. 所有的屬性值必須使用比引號

6. 層次要清楚

7. 相同標記不能嵌套

8. 可以使用實體 & ;

9. 注釋問題

10. <![CDATA[ ]]>

PHP如何處理XML文件

其實使用php的xml解析函數,處理xml文檔無異于處理文件,只要你根據自己的具體需求編寫好幾個處理函數就萬事大吉了,明白了xml文件的讀取,那么生成xml文件也就不成問題了,需要注意的問題是注意xml文件的編碼和書寫規范.

下面是手冊里的例子,確實是經典的例子,代碼如下:

  1. <?php 
  2. $file = "xmltest.xml"
  3. //驗證文件的合法性 
  4. function trustedFile($file) { 
  5.     // only trust local files owned by ourselves 
  6.     if (!eregi("^([a-z]+)://"$file
  7.         && fileowner($file) == getmyuid()) { 
  8.             return true; 
  9.     } 
  10.     return false; 
  11. //處理起始標記的函數。用特殊顏色標記并輸出顯示。 
  12. //注意$attribs為數組 
  13. function startElement($parser$name$attribs=array() ) { 
  14.     print "&lt;<font color="#0000cc">$name</font>"
  15.     if (sizeof($attribs)) { 
  16.         while (list($k$v) = each($attribs)) { 
  17.             print " <font color="#009900">$k</font>="<font 
  18.                    color="#990000">$v</font>""
  19.         } 
  20.     } 
  21.     print "&gt;"
  22. //結束標記處理并顯示 
  23. function endElement($parser$name) { 
  24.     print "&lt;/<font color="#0000cc">$name</font>&gt;"
  25. //處理數據部分 
  26. function characterData($parser$data) { 
  27.     print "<b>$data</b>"
  28. //處理指令(PI)處理器 參數處理函數 
  29. function PIHandler($parser$target$data) { 
  30.     switch (strtolower($target)) { 
  31.         case "php"
  32.             global $parser_file
  33.             // If the parsed document is "trusted", we say it is safe 
  34.             // to execute PHP code inside it.  If not, display the code 
  35.             // instead. 
  36.             if (trustedFile($parser_file[$parser])) { 
  37.                 eval($data); 
  38.             } else { 
  39.                 printf("Untrusted PHP code: <i>%s</i>"
  40.                         htmlspecialchars($data)); 
  41.             } 
  42.             break
  43.     } 
  44. //默認處理句柄 
  45. function defaultHandler($parser$data) { 
  46.     if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {//判斷數據是否為外部實體,注意這種判斷方法。 
  47.         printf('<font color="#aa00aa">%s</font>'
  48.                 htmlspecialchars($data)); 
  49.     } else { 
  50.         printf('<font size="-1">%s</font>'
  51.                 htmlspecialchars($data)); 
  52.     } 
  53. //外部實體處理句柄 
  54. function externalEntityRefHandler($parser$openEntityNames$base$systemId,$publicId) { 
  55.     if ($systemId) { 
  56.         if (!list($parser$fp) = new_xml_parser($systemId)) { 
  57.             printf("Could not open entity %s at %sn"$openEntityNames
  58.                    $systemId); 
  59.             return false; 
  60.         } 
  61.         while ($data = fread($fp, 4096)) { 
  62.             if (!xml_parse($parser$datafeof($fp))) { 
  63.                 printf("XML error: %s at line %d while parsing entity %sn"
  64.                        xml_error_string(xml_get_error_code($parser)), 
  65.                        xml_get_current_line_number($parser), $openEntityNames); 
  66.                 xml_parser_free($parser); 
  67.                 return false; 
  68.             } 
  69.         } 
  70.         xml_parser_free($parser); 
  71.         return true; 
  72.     } 
  73.     return false; 
  74. //xml分析器。 
  75. function new_xml_parser($file) { 
  76.     global $parser_file
  77.     $xml_parser = xml_parser_create(); //建立一個 XML 解析器,此函數返回解釋器的操作句柄。 
  78.     xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); //設置是否采用大小寫折疊,及目標編碼 
  79.     xml_set_element_handler($xml_parser"startElement""endElement");//建立起始和終止元素處理器,bool 
  80.     xml_set_character_data_handler($xml_parser"characterData");//建立字符數據處理器,bool 
  81.     xml_set_processing_instruction_handler($xml_parser"PIHandler");//建立處理指令(PI)處理器 
  82.     xml_set_default_handler($xml_parser"defaultHandler"); //默認處理器 
  83.     xml_set_external_entity_ref_handler($xml_parser"externalEntityRefHandler");//外部實體指向處理器 
  84.     
  85.     if (!($fp = @fopen($file"r"))) { 
  86.         return false; 
  87.     } 
  88.     if (!is_array($parser_file)) { 
  89.         settype($parser_file"array");//將文件處理變量設為array類型 
  90.     } 
  91.     $parser_file[$xml_parser] = $file//?將文件名賦值給以解釋器操作句柄為索引的數組?(解釋器的句柄以資源記錄的形式返回) 
  92. //    echo "<font color=red >parser = "; 
  93. //    print_r($parser_file); 
  94. //    echo "<br>$xml_parser"; 
  95. //    echo "</font>"; 
  96.     return array($xml_parser$fp); //解釋器的操作句柄 和待分析文件的句柄 
  97. if (!(list($xml_parser$fp) = new_xml_parser($file))) { 
  98.     die("could not open XML input"); 
  99. print "<pre>"
  100. while ($data = fread($fp, 4096)) { 
  101.     if (!xml_parse($xml_parser$datafeof($fp))) {//此處采用條件賦值。當條件表達式失效時執行if處理,否則跳過。 
  102.         die(sprintf("XML error: %s at line %dn"
  103.                     xml_error_string(xml_get_error_code($xml_parser)), 
  104.                     xml_get_current_line_number($xml_parser))); 
  105.     } 
  106. }//開源代碼Vevb.com 
  107. print "</pre>"
  108. print "parse completen"
  109. xml_parser_free($xml_parser); 
  110. ?> 

xmltest.xml文件,實例代碼如下:

  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <!--因為對xml了解不是很深,故將實體引用部分略去了 --> 
  3. <chapter> 
  4.  <TITLE>Title </TITLE> 
  5.  <para> 
  6.   <informaltable> 
  7.    <tgroup cols="3"> 
  8.     <tbody> 
  9.      <row><entry>a1</entry><entry morerows="1">b1</entry><entry>c1</entry></row> 
  10.      <row><entry>a2</entry><entry>c2</entry></row> 
  11.      <row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row> 
  12.     </tbody> 
  13.    </tgroup> 
  14.   </informaltable> 
  15.  </para> 
  16.  <section id="about"> 
  17.   <title>About this Document</title> 
  18.   <para> 
  19.    <!-- this is a comment --> 
  20.    <?php print 'Hi!  This is PHP version '.phpversion(); ?> 
  21.   </para> 
  22.  </section> 
  23.  </chapter> 

還有一個是將xml文件處理成php數組的例子,代碼如下:

  1. <?php 
  2. class AminoAcid { 
  3.     var $name;  // aa name 
  4.     var $symbol;    // three letter symbol 
  5.     var $code;  // one letter code 
  6.     var $type;  // hydrophobic, charged or neutral 
  7.     
  8.     function AminoAcid ($aa) { 
  9.         foreach ($aa as $k=>$v
  10.             $this->$k = $aa[$k]; 
  11.     } 
  12. function readDatabase($filename) { 
  13.     // read the xml database of aminoacids 
  14.     $data = implode("",file($filename));//首先將整篇文章讀入數組,之后再將數組連接成字符串,賦值給$data. 
  15.     $parser = xml_parser_create(); 
  16.     xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);//不使用大小寫折疊 
  17.     xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1); 
  18.     xml_parse_into_struct($parser,$data,$values,$tags);//將 XML 數據解析到數組中,該函數將 XML 文件解析到兩個對應的數組中, 
  19.                 //$tags 參數含有指向 $values 數組中對應值的指針。最后兩個數組參數可由指針傳遞給函數。 
  20.     xml_parser_free($parser); 
  21.     // loop through the structures 
  22.     //針對具體的應用(不同的xml文件,修改此處循環結構得到具體的數組即可。 
  23.     foreach ($tags as $key=>$val) { 
  24.         if ($key == "molecule") { 
  25.             $molranges = $val
  26.             // each contiguous pair of array entries are the 
  27.             // lower and upper range for each molecule definition 
  28.             for ($i=0; $i < count($molranges); $i+=2) { 
  29.                     $offset = $molranges[$i] + 1; 
  30.                 $len = $molranges[$i + 1] - $offset
  31.                 $tdb[] = parseMol(array_slice($values$offset$len)); 
  32.             } 
  33.         } else { 
  34.             continue
  35.         } 
  36.     }  
  37. //    echo "<font color=red>values is:"; 
  38. //    print_r($values); 
  39. //    echo "</font>"; 
  40.     return array($tdb,$values); 
  41. function parseMol($mvalues) { 
  42.     for ($i=0; $i < count($mvalues); $i++) 
  43.         $mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"]; 
  44.         
  45. //    echo "<font color=blue> after parsemol :"; 
  46. //    print_r($mol); 
  47. //    echo "</font>"; 
  48.     return new AminoAcid($mol); 
  49. $db = readDatabase("moldb.xml"); 
  50. echo "** Database of AminoAcid objects:n"
  51.    // echo "<font color=purple> readdatabase :"; 
  52.     print_r($db[0]); 
  53.    // echo "</font>"; 
  54.  
  55. $s = parseMol($db[1]); 
  56. ?> 

副 moldb.xml,代碼如下:

  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <moldb> 
  3.     <molecule> 
  4.         <name>Alanine</name> 
  5.         <symbol>ala</symbol> 
  6.         <code>A</code> 
  7.         <type>hydrophobic</type> 
  8.     </molecule> 
  9.     <molecule> 
  10.         <name>Lysine</name> 
  11.         <symbol>lys</symbol> 
  12.         <code>K</code> 
  13.         <type>charged</type> 
  14.     </molecule> 
  15. </moldb> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 曲靖市| 乐山市| 淮北市| 卓尼县| 福清市| 鹤峰县| 洛宁县| 岚皋县| 西平县| 大宁县| 西昌市| 彰化县| 海盐县| 安福县| 中江县| 贺兰县| 盱眙县| 黔江区| 称多县| 三穗县| 湛江市| 东莞市| 垦利县| 泰顺县| 和平区| 延吉市| 滨海县| 祁连县| 招远市| 娱乐| 图片| 瑞金市| 临泽县| 鹿邑县| 北安市| 北海市| 汉川市| 湖南省| 山西省| 科技| 蒲江县|