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

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

XML数据结构大概是这样子的:

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

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

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

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

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

<?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 操作类 大文件”,这篇文章的思路应该就是你需要的。

你可能感兴趣的文章

壮壮呆瓜 · 2015年09月09日

我遇到和你类似的问题,不过用户上传的是较大的execel文件,用户在浏览器上传excel文件,我用PHP接收文件,然后读出来,用的好像是phpExcle这个工具,但是一旦数据达到4万行就挂了。有没有什么比较好的办法呢,我的接收的文件是excel,然后这些数据都要入库,顺带说一下,只有一个文件,所以单个文件比较大。之前一直想不要比较好的方法,所以只能将php的memory_limit值设大些,但是这不是一个好方法,数据一多就出问题,不知道大神有没有什么好点的方法呢,求指教。

回复

王道中强流 作者 · 2015年09月09日

这方面就没什么研究了,excel文件和xml文件还是有区别的,xml只是普通文本文件,excel文件用记事本打开的话则是一堆乱码。

回复

王道中强流 作者 · 2015年09月09日

我的建议是在上传之前 让用户将Excel文件另存为xml文件。。。

回复

wgqi1126 · 2015年09月09日

xml object 还是太难用,转成json爽呆呆。
`function object2array($object) { return @json_decode(@json_encode($object),1); }
`
http://php.net/manual/zh/function.simplexml-load-string.php#102277| ec1f38c0f234d40288e745efd4fe518b1 |

回复

mango_pi · 2016年01月31日

尽量让用户上传.cvs格式试试,这个格式是文本文档,可以逐行读取,而且也可以用Excel编辑;Excel的默认格式.xls之类的是二进制,读取很不方便。

回复

载入中...
王道中强流 王道中强流

1.5k 声望

发布于专栏

王道中强流

不为繁华易匠心

6 人关注