程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 怎麼用php解析xml文件

怎麼用php解析xml文件

編輯:關於PHP編程

       DOMElement

      DOMElement DOMDocument::createElement ( string $name [, string $value ] )

      創建節點元素

      String $name:節點名

      String $value:節點的值

      8、 添加節點

      •DOMNode DOMNode::appendChild ( DOMNode $newnode )

      添加子節點

      DOMNode $newnode:新節點

      在dom操作中,增刪改操作必須依賴於父節點

      9、 保存

      •string DOMDocument::saveXML

      保存至某個字符串中

      •int DOMDocument::save ( string $filename )

      保存至某個文件中

      String $filename:文件名

      10、 刪除節點

      •DOMNode DOMNode::removeChild ( DOMNode $oldnode )

      刪除節點

      DOMNode $oldnode:要刪除的節點

      11、 更新節點

      •DOMNode DOMNode::replaceChild ( DOMNode $newnode , DOMNode $oldnode )

      DOMNode $newnode:新節點

      DOMNode $oldnode:原節點

      12、 添加屬性

      •DOMAttr DOMElement::setAttribute( string $name , string $value )

      string $name :屬性名

      string $value :屬性值

      13、 修改屬性

      DOMAttr DOMElement::setAttribute( string $name , string $value )

      string $name :屬性名

      string $value :屬性值

      14、 刪除屬性

      •bool DOMElement::removeAttribute ( string $name )

      string $name:要刪除的屬性名稱

      15、 獲取屬性

      •string DOMElement::getAttribute ( string $name )

      string $name:要獲取的屬性值的屬性名

      DOMDocument還是PHP5後推出的DOM擴展的一部分,可用來建立或解析html/xml,目前只支持utf-8編碼。

    代碼如下  

    $xmlstring = <<<XML
    <?xml version='1.0'?>
    <document>
    <cmd attr='default'>login</cmd>
    <login>imdonkey</login>
    </document>
    XML;

    $dom = new DOMDocument();
    $dom->loadXML($xmlstring);
    print_r(getArray($dom->documentElement));

    function getArray($node) {
    $array = false;

    if ($node->hasAttributes()) {
    foreach ($node->attributes as $attr) {
    $array[$attr->nodeName] = $attr->nodeValue;
    }
    }

    if ($node->hasChildNodes()) {
    if ($node->childNodes->length == 1) {
    $array[$node->firstChild->nodeName] = getArray($node->firstChild);
    } else {
    foreach ($node->childNodes as $childNode) {
    if ($childNode->nodeType != XML_TEXT_NODE) {
    $array[$childNode->nodeName][] = getArray($childNode);
    }
    }
    }
    } else {
    return $node->nodeValue;
    }
    return $array;
    }

      SimpleXML

      SimpleXML是PHP5後提供的一套簡單易用的xml工具集,可以把xml轉換成方便處理的對象,也可以組織生成xml數據。不過它不適用於包含namespace的xml,而且要保證xml格式完整(well-formed)。它提供了三個方法:simplexml_import_dom、simplexml_load_file、simplexml_load_string,函數名很直觀地說明了函數的作用。三個函數都返回SimpleXMLElement對象,數據的讀取/添加都是通過SimpleXMLElement操作

    代碼如下  


    $string = <<<XML
    <?xml version='1.0'?>
    <document>
    <cmd>login</cmd>
    <login>imdonkey</login>
    </document>
    XML;

    $xml = simplexml_load_string($string);
    print_r($xml);
    $login = $xml->login;//這裡返回的依然是個SimpleXMLElement對象
    print_r($login);
    $login = (string) $xml->login;//在做數據比較時,注意要先強制轉換
    print_r($login);

      SimpleXML的優點是開發簡單,缺點是它會將整個xml載入內存後再進行處理,所以在解析超多內容的xml文檔時可能會力不從心。如果是讀取小文件,而且xml中也不包含namespace,那SimpleXML是很好的選擇。

      XMLReader

      XMLReader也是PHP5之後的擴展(5.1後默認安裝),它就像游標一樣在文檔流中移動,並在每個節點處停下來,操作起來很靈活。它提供了對輸入的快速和非緩存的流式訪問,可以讀取流或文檔,使用戶從中提取數據,並跳過對應用程序沒有意義的記錄。

      以一個利用google天氣api獲取信息的例子展示下XMLReader的使用,這裡也只涉及到一小部分函數,更多還請參考官方文檔。

    代碼如下  

    $xml_uri = 'http://www.google.com/ig/api?weather=Beijing&hl=zh-cn';
    $current = array();
    $forecast = array();

    $reader = new XMLReader();
    $reader->open($xml_uri, 'gbk');
    while ($reader->read()) {
    //get current data
    if ($reader->name == "current_conditions" && $reader->nodeType == XMLReader::ELEMENT) {
    while($reader->read() && $reader->name != "current_conditions") {
    $name = $reader->name;
    $value = $reader->getAttribute('data');
    $current[$name] = $value;
    }
    }

    //get forecast data
    if ($reader->name == "forecast_conditions" && $reader->nodeType == XMLReader::ELEMENT) {
    $sub_forecast = array();
    while($reader->read() && $reader->name != "forecast_conditions") {
    $name = $reader->name;
    $value = $reader->getAttribute('data');
    $sub_forecast[$name] = $value;
    }
    $forecast[] = $sub_forecast;
    }
    }
    $reader->close();

      XMLReader和XML Parser類似,都是邊讀邊操作,較大的差異在於SAX模型是一個“推送”模型,其中分析器將事件推到應用程序,在每次讀取新節點時通知應用程序,而使用XmlReader的應用程序可以隨意從讀取器提取節點,可控性更好。

      由於XMLReader基於libxml,所以有些函數要參考文檔看看是否適用於你的libxml版本。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved