Home  >  Article  >  php教程  >  PHP 处理XML文件实例详解

PHP 处理XML文件实例详解

WBOY
WBOYOriginal
2016-05-25 16:42:131446browse

XML的精髓是什么呢?

就是我们基于信息描述的,能够体现数据信息之间逻辑关系的,可以确保文件的易读性和易搜索性的自定义标记.

你的XML文件遵循所谓“形式良好”要求的种种语法规则,一个完全意义上的XML文件不仅应该是“形式良好的”,而且还应该是使用了这些自定义标记的“有效”的XML文件.

一个XML文件必须遵守文件类型描述DTD(Document Type Definition)中定义的种种规定,DTD实际上是“元标记”这个概念的产物,它描述了一个标记语言的语法和词汇表,也就是定义了文件的整体结构以及文件的语法,简而言之,DTD规定了一个语法分析器为了解释一个“有效的”XML文件所需要知道的所有规则的细节.

如何写一个XML文件

1. 第一个行

2. 必须有一个最外层的标记

3. XML标记不区分大小写,使用中文都可以,开始标记是什么,结束就必须是什么

4. 所有的XML标记必须有结束

5. 所有的属性值必须使用比引号

6. 层次要清楚

7. 相同标记不能嵌套

8. 可以使用实体 & ;

9. 注释问题

10.

PHP如何处理XML文件

其实使用php的xml解析函数,处理xml文档无异于处理文件,只要你根据自己的具体需求编写好几个处理函数就万事大吉了,明白了xml文件的读取,那么生成xml文件也就不成问题了,需要注意的问题是注意xml文件的编码和书写规范.

下面是手册里的例子,确实是经典的例子,代码如下:

<?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(&#39;<font color="#aa00aa">%s</font>&#39;, 
	                htmlspecialchars($data)); 
	    } else { 
	        printf(&#39;<font size="-1">%s</font>&#39;, 
	                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 class="brush:php;toolbar:false">"; 
	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))); 
	    } 
	}//开源代码phprm.com 
	print "
";  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 &#39;Hi!  This is PHP version &#39;.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> 

教程链接:

随意转载~但请保留教程地址★

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn