PHP 處理XML檔案執行個體詳解

來源:互聯網
上載者:User

XML的精髓是什麼呢?

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 "&lt;<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 "&gt;";
}
//結束標記處理並顯示
function endElement($parser, $name) {
    print "&lt;/<font color="#0000cc">$name</font>&gt;";
}
//處理資料部分
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)));
    }
}
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>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.