ホームページ  >  記事  >  php教程  >  PHP 处理XML文件实例详解

PHP 处理XML文件实例详解

WBOY
WBOYオリジナル
2016-05-25 16:42:131496ブラウズ

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> 

教程链接:

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。