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文件的編碼和書寫規范.
下面是手冊里的例子,確實是經典的例子,代碼如下:
- <?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('<font color="#aa00aa">%s</font>',
- htmlspecialchars($data));
- } else {
- printf('<font size="-1">%s</font>',
- 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>";
- 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)));
- }
- }//開源代碼Vevb.com
- print "</pre>";
- 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 'Hi! This is PHP version '.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>
新聞熱點
疑難解答