【问题标题】:Loading XML data into MySQL 5.0将 XML 数据加载到 MySQL 5.0
【发布时间】:2012-11-10 03:39:44
【问题描述】:

这里完全缺乏合适的解决方案让我发疯。

一位客户给了我一个 14MB 大小的 XML 文件,在以后的请求中可能会更大。我需要一个可以定期将其数据加载到 MySQL 表中的脚本。服务器运行的是 MySQL 5.0.96,所以我不相信 LOAD XML 命令对我可用。

我尝试使用 PHP DOM 库来解析 XML 文件,但 Apache 返回 500 内部服务器错误。我认为这是内存不足,因为我可以注释掉加载 XML 文件的 PHP 代码并且脚本运行顺利(没有数据)。服务器上的内存限制已经是 128MB。

我也尝试过 XMLReader,它似乎做同样的事情。有什么建议吗?

【问题讨论】:

  • 是的,xmlreader 可能是一个不错的选择,但您的问题到底是什么?
  • 当我尝试使用 Dom Lib 或 XMLReader 加载此 XML 文件时,由于内存限制,服务器返回 500 内部服务器错误。有没有更好的方法使用 PHP 将 XML 放入表中?
  • 你试过python了吗?使用 python 做这样的事情很容易
  • 我们客户使用的平台是PHP。我无法建议我们此时切换到 python。
  • XMLReader 作为迭代器工作,因此与 dom 或 simplexml 解析器不同,它不必将完整的 xml 文件加载到内存中。您能否展示一些 xml 文件的示例,以便我们了解如何生成 xml 元素 -> sql 行?

标签: php mysql xml xml-parsing


【解决方案1】:

XMLReader 用作迭代器,因此您必须根据 xml 文档的各个标记来实现分组/提取逻辑。假设您的 xml 文件中有一个类似 <row> 的元素对应于单个插入,它可能看起来像这样:

$reader = new XMLReader();
$reader->open('/path/to/the/file.xml');
while ($reader->read()) {
    if ($reader->name == "row" && $reader->nodeType == XMLReader::ELEMENT) {
        // the cursor currently at <row> element

        // hopefully one fragment will fit into memory and you can use simplexml for easy access
        // alternatively try $reader->expand() for DOMNode of the same thing
        $rowxml = simplexml_load_string('<'.'?xml version='1.0'?'.'>'.$reader->readOuterXML());

        // build insert from the $rowxml object, run the query
    }
}
$reader->close();

【讨论】:

    猜你喜欢
    • 2012-09-09
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多