用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > php教程

PHP 处理XML文件实例详解

时间:2015-01-23  来源:西部数据  作者:西部数据

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. }//开源代码phpfensi.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> 
来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
栏目更新
栏目热门