首页 > 开发 > 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. //处理起始标记的函数。用特殊颜色标记并输出显示。 
  13. //注意$attribs为数组 
  14. function startElement($parser, $name, $attribs=array() ) { 
  15.     print "&lt;<font color="#0000cc">$name</font>"; 
  16.     if (sizeof($attribs)) { 
  17.         while (list($k, $v) = each($attribs)) { 
  18.             print " <font color="#009900">$k</font>="<font 
  19.                    color="#990000">$v</font>""; 
  20.         } 
  21.     } 
  22.     print "&gt;"; 
  23. } 
  24. //结束标记处理并显示 
  25. function endElement($parser, $name) { 
  26.     print "&lt;/<font color="#0000cc">$name</font>&gt;"; 
  27. } 
  28. //处理数据部分 
  29. function characterData($parser, $data) { 
  30.     print "<b>$data</b>"; 
  31. } 
  32. //处理指令(PI)处理器 参数处理函数 
  33. function PIHandler($parser, $target, $data) { 
  34.     switch (strtolower($target)) { 
  35.         case "php": 
  36.             global $parser_file; 
  37.             // If the parsed document is "trusted", we say it is safe 
  38.             // to execute PHP code inside it.  If not, display the code 
  39.             // instead. 
  40.             if (trustedFile($parser_file[$parser])) { 
  41.                 eval($data); 
  42.             } else { 
  43.                 printf("Untrusted PHP code: <i>%s</i>", 
  44.                         htmlspecialchars($data)); 
  45.             } 
  46.             break; 
  47.     } 
  48. } 
  49. //默认处理句柄 
  50. function defaultHandler($parser, $data) { 
  51.     if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {//判断数据是否为外部实体,注意这种判断方法。 
  52.         printf('<font color="#aa00aa">%s</font>', 
  53.                 htmlspecialchars($data)); 
  54.     } else { 
  55.         printf('<font size="-1">%s</font>', 
  56.                 htmlspecialchars($data)); 
  57.     } 
  58. } 
  59. //外部实体处理句柄 
  60. function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId,$publicId) { 
  61.     if ($systemId) { 
  62.         if (!list($parser, $fp) = new_xml_parser($systemId)) { 
  63.             printf("Could not open entity %s at %sn", $openEntityNames, 
  64.                    $systemId); 
  65.             return false; 
  66.         } 
  67.         while ($data = fread($fp, 4096)) { 
  68.             if (!xml_parse($parser, $data, feof($fp))) { 
  69.                 printf("XML error: %s at line %d while parsing entity %sn", 
  70.                        xml_error_string(xml_get_error_code($parser)), 
  71.                        xml_get_current_line_number($parser), $openEntityNames); 
  72.                 xml_parser_free($parser); 
  73.                 return false; 
  74.             } 
  75.         } 
  76.         xml_parser_free($parser); 
  77.         return true; 
  78.     } 
  79.     return false; 
  80. } 
  81. //xml分析器。 
  82. function new_xml_parser($file) { 
  83.     global $parser_file; 
  84.     $xml_parser = xml_parser_create(); //建立一个 XML 解析器,此函数返回解释器的操作句柄。 
  85.     xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); //设置是否采用大小写折叠,及目标编码 
  86.     xml_set_element_handler($xml_parser, "startElement", "endElement");//建立起始和终止元素处理器,bool 
  87.     xml_set_character_data_handler($xml_parser, "characterData");//建立字符数据处理器,bool 
  88.     xml_set_processing_instruction_handler($xml_parser, "PIHandler");//建立处理指令(PI)处理器 
  89.     xml_set_default_handler($xml_parser, "defaultHandler"); //默认处理器 
  90.     xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");//外部实体指向处理器 
  91.     
  92.     if (!($fp = @fopen($file, "r"))) { 
  93.         return false; 
  94.     } 
  95.     if (!is_array($parser_file)) { 
  96.         settype($parser_file, "array");//将文件处理变量设为array类型 
  97.     } 
  98.     $parser_file[$xml_parser] = $file; //?将文件名赋值给以解释器操作句柄为索引的数组?(解释器的句柄以资源记录的形式返回) 
  99. //    echo "<font color=red >parser = "; 
  100. //    print_r($parser_file); 
  101. //    echo "<br>$xml_parser"; 
  102. //    echo "</font>"; 
  103.     return array($xml_parser, $fp); //解释器的操作句柄 和待分析文件的句柄 
  104. } 
  105. if (!(list($xml_parser, $fp) = new_xml_parser($file))) { 
  106.     die("could not open XML input"); 
  107. } 
  108. print "<pre>"; 
  109. while ($data = fread($fp, 4096)) { 
  110.     if (!xml_parse($xml_parser, $data, feof($fp))) {//此处采用条件赋值。当条件表达式失效时执行if处理,否则跳过。 
  111.         die(sprintf("XML error: %s at line %dn", 
  112.                     xml_error_string(xml_get_error_code($xml_parser)), 
  113.                     xml_get_current_line_number($xml_parser))); 
  114.     } 
  115. }//开源代码Vevb.com 
  116. print "</pre>"; 
  117. print "parse completen"; 
  118. xml_parser_free($xml_parser); 
  119. ?> 

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. } 
  13. function readDatabase($filename) { 
  14.     // read the xml database of aminoacids 
  15.     $data = implode("",file($filename));//首先将整篇文章读入数组,之后再将数组连接成字符串,赋值给$data. 
  16.     $parser = xml_parser_create(); 
  17.     xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);//不使用大小写折叠 
  18.     xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1); 
  19.     xml_parse_into_struct($parser,$data,$values,$tags);//将 XML 数据解析到数组中,该函数将 XML 文件解析到两个对应的数组中, 
  20.                 //$tags 参数含有指向 $values 数组中对应值的指针。最后两个数组参数可由指针传递给函数。 
  21.     xml_parser_free($parser); 
  22.     // loop through the structures 
  23.     //针对具体的应用(不同的xml文件,修改此处循环结构得到具体的数组即可。 
  24.     foreach ($tags as $key=>$val) { 
  25.         if ($key == "molecule") { 
  26.             $molranges = $val; 
  27.             // each contiguous pair of array entries are the 
  28.             // lower and upper range for each molecule definition 
  29.             for ($i=0; $i < count($molranges); $i+=2) { 
  30.                     $offset = $molranges[$i] + 1; 
  31.                 $len = $molranges[$i + 1] - $offset; 
  32.                 $tdb[] = parseMol(array_slice($values, $offset, $len)); 
  33.             } 
  34.         } else { 
  35.             continue; 
  36.         } 
  37.     }  
  38. //    echo "<font color=red>values is:"; 
  39. //    print_r($values); 
  40. //    echo "</font>"; 
  41.     return array($tdb,$values); 
  42. } 
  43. function parseMol($mvalues) { 
  44.     for ($i=0; $i < count($mvalues); $i++) 
  45.         $mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"]; 
  46.         
  47. //    echo "<font color=blue> after parsemol :"; 
  48. //    print_r($mol); 
  49. //    echo "</font>"; 
  50.     return new AminoAcid($mol); 
  51. } 
  52. $db = readDatabase("moldb.xml"); 
  53. echo "** Database of AminoAcid objects:n"; 
  54.    // echo "<font color=purple> readdatabase :"; 
  55.     print_r($db[0]); 
  56.    // echo "</font>"; 
  57.  
  58. $s = parseMol($db[1]); 
  59. ?> 

副 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> 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表