本文由 简悦 SimpRead) 转码, 原文地址 segmentfault.com)

    由于工作原因,不得不与一个二逼团队合作,
    我说直接导出 SQL 文件给我就好了,而他们坚持要导出 XML 文件。
    或者他们有他们的原因吧,但我还是要叫他们二逼团队,懒得了解他们有什么苦衷。

    我想 MySQL 应该是支持导入 XML 的话,搜索的结果是什么我忘了。
    反正我最后决定还是自己写一段 PHP 来生成 SQL 语句。

    XML 数据结构大概是这样子的:
    PHP读取XML大文件 数据导入 - 图1

    文件很大,有很多<object>,也就是很多记录,但是单个记录里的数据并不大。

    PHP 里关于 XML 的操作有很多类和函数。
    详见:http://php.net/manual/zh/refs.xml.php
    其中常用的应该是XMLReaderSimpleXML(纯属个人感觉,并没有数据支持)
    XMLReader是以文件流的方式 一句一句读取,主要用来处理体积很大的 XML 文件,但用起来比较麻烦。
    SimpleXML用起来则便捷了许多,但它没办法处理很大的 XML 数据。

    刚开始我只用XMLReader来导入,当然也是可以导入的,但是嵌套了好几层循环和判断。
    要不是后来又要导入一批数据,我几乎以为只能这样写了。

    第二次导入的时候,我采用的方法是结合XMLReaderSimpleXML
    因为不管你 XML 文件再怎么大,单条记录的数据能大到哪里去?(我说的是一般情况)

    想到这个方法之后,于是代码就简洁到 我都不好意思发出来的程度了。
    但是为了让这篇文章的读者 对这种简洁有个更直观的感受,我还是厚着脸皮发一下吧:

    1. <?php
    2. $xml = new XMLReader();
    3. $xml->open(__DIR__ . '/company.xml');
    4. while($xml->read()) {
    5. if($xml->name=='object' and $xml->nodeType==XMLReader::ELEMENT) {
    6. $inXml = $xml->readOuterXML();
    7. $inXml = simplexml_load_string($inXml);
    8. var_dump($inXml);
    9. }
    10. }

    就是这样了,如果你还在为XMLReader太难用,SimpleXML搞不定大文件,而苦苦搜寻 “php xml 操作类 大文件”,这篇文章的思路应该就是你需要的。