另闢蹊徑 搞定PHP讀取XML大文件 數據導入

因爲工做緣由,不得不與一個二逼團隊合做,
我說直接導出SQL文件給我就行了,而他們堅持要導出XML文件。
或者他們有他們的緣由吧,但我仍是要叫他們二逼團隊,懶得了解他們有什麼苦衷。php

我想MySQL應該是支持導入XML的話,搜索的結果是什麼我忘了。
反正我最後決定仍是本身寫一段PHP來生成SQL語句。node

XML數據結構大概是這樣子的:
圖片描述數據庫

文件很大,有不少<object>,也就是不少記錄,可是單個記錄裏的數據並不大。數據結構

PHP裏關於XML的操做有不少類和函數。
詳見:http://php.net/manual/zh/refs.xml.php
其中經常使用的應該是XMLReaderSimpleXML(純屬我的感受,並無數據支持)
XMLReader是以文件流的方式 一句一句讀取,主要用來處理體積很大的XML文件,但用起來比較麻煩。
SimpleXML用起來則便捷了許多,但它沒辦法處理很大的XML數據。函數

剛開始我只用XMLReader來導入,固然也是能夠導入的,可是嵌套了好幾層循環和判斷。
要不是後來又要導入一批數據,我幾乎覺得只能這樣寫了。spa

第二次導入的時候,我採用的方法是結合XMLReaderSimpleXML
由於無論你XML文件再怎麼大,單條記錄的數據能大到哪裏去?(我說的是通常狀況).net

想到這個方法以後,因而代碼就簡潔到 我都很差意思發出來的程度了。
可是爲了讓這篇文章的讀者 對這種簡潔有個更直觀的感覺,我仍是厚着臉皮發一下吧:code

<?php
$xml = new XMLReader();
$xml->open(__DIR__ . '/company.xml');

while($xml->read()) {
    if($xml->name=='object' and $xml->nodeType==XMLReader::ELEMENT) { // 進入 object
        $inXml = $xml->readOuterXML(); // 獲取當前整個 object 內容(字符串)
        $inXml = simplexml_load_string($inXml); // 轉換成 SimpleXMLElement 對象

        // 而後沒有了 就這麼簡單 具體怎麼保存到數據庫 dump 一下 $inXml 你就懂了
        var_dump($inXml);
    }
    // 繼續讀取 直到進入下一個 object
}

就是這樣了,若是你還在爲XMLReader太難用,SimpleXML搞不定大文件,而苦苦搜尋「php xml 操做類 大文件」,這篇文章的思路應該就是你須要的。xml

相關文章
相關標籤/搜索