【问题标题】:Import invalid XML file (1.5G) into MySQL with unescaped ampersand将无效的 XML 文件 (1.5G) 导入带有未转义 & 的 MySQL
【发布时间】:2013-04-29 14:22:09
【问题描述】:

我无法将我的大 xml 文件 (1,5g) 导入数据库。然后我使用XMLReader->read() 我有错误元素有一个&符号。也许你可以帮我在哪里将无效的 XML 文件转换为有效的?

我在 Windows 7 上使用 tidy、xmlsoft、sed,但是这个命令行软件在限制内存错误时中断。

PHP:

$reader = new XMLReader();
$reader->open('sm.xml');

    while ($reader->read())
        {
        // check to ensure nodeType is an Element not attribute or #Text
            if ($reader->nodeType == XMLReader::ELEMENT)
                    {
                        if ($reader->localName == 'brand')
                                {
                                    $reader->read();
                                    $data['brand'] = $reader->value;
                                }
                        if ($reader->localName == 'number')
                                {
                                    $reader->read();
                                    $data['number'] = $reader->value;
                                }
                        if ($reader->localName == 'descr')
                                {
                                    $reader->read();
                                    $data['descr'] = $reader->value;
                                }

                        if ($reader->localName == 'price')
                                {
                                    $reader->read();
                                    $data['price'] = $reader->value;
                                }
                        if ($reader->localName == 'deadline')
                                {
                                    $reader->read();
                                    $data['deadline'] = $reader->value;
                                }
                        if ($reader->localName == 'rest')
                                {
                                    $reader->read();
                                    $data['rest'] = $reader->value;
                                }
            } //Checking if the </person>tag is reached.
            elseif($reader->nodeType == XMLReader::END_ELEMENT AND $reader->name == 'article')
                {

                    $sql = 'INSERT INTO tec (brand_name,brand_art,name_tov,cena,srok,kolvo) 
  VALUES ("'.$data['brand'].'","'.$data['number'].'","'.$data['descr'].'","'.$data['price'].'","'.$data['deadline'].'","'.$data['rest'].'");';
    $mysqli->query($sql);

                // Insert the content of array $data to database or some other action.
                //print_r($data);

                }
}

如果此代码读取元素 &lt;number&gt;111&amp;111&lt;/number&gt; 我有一个错误。我可以使用命令行工具删除这个 & 符号,但是我在非常大的 xml 文件上内存不足。

我的示例运行:

xmllint.exe --recover --maxmem 10000000000 --noout --encode utf8 sm.xml -o smtt.xml
tidy.exe -m -utf8 -xml sm.xml
sed.exe 's/&/\&amp;/g; s/&amp;amp;/\&amp;/g; s/&amp;quot;/\&quot;/g;' sm.xml > smtt.xml <-- can't run

也许有其他方式使用带有跳过验证的 PHP XMLReader?

【问题讨论】:

  • 我们也可以查看您的 PHP 代码吗?问题是你有一个&符号,还是你的内存不足?你得到的确切错误是什么?
  • 问题在哪里我有&符号,我不能逃脱或跳过这个字符?内存不足,然后我重新验证了一个大的 xml 文件,以便为 php xmlreader 准备读取。错误 php 警告:XMLReader->read() 111&111
  • 对,所以你有两个错误:一个是如果你尝试修复无效的 XML,你会耗尽内存,第二个是如果你不修复无效的 XML,你得到一个阅读器错误。第二个是预期的,因此您应该尝试修复您的 XML。 1. 究竟哪个命令行实用程序内存不足? 2. 你能用另一个实用程序替换它吗?
  • xmllint 和 tidy 内存不足,sed.exe 无法运行,但我找到了启动此实用程序的选项。我还没有找到另一个实用程序...我认为这个 unix 端口对我有帮助,但是两个实用程序内存不足。如果他们找不到其他方法来解决我的问题 - 我会编写新的“xml 阅读器”,它将从文件中逐行读取。
  • 谁生成了这个糟糕的 XML?它有多糟糕:你甚至知道吗?修复 1.5Gb 的坏数据真的比修复生成它的程序更容易吗?

标签: php mysql xml xmlreader ampersand


【解决方案1】:

XMLMax 编辑器(来自 xponentsoftware)将定位错误并允许您在其虚拟文本编辑器中修复它。 1.5 GB 应该没问题。

免责声明:我隶属于供应商。

【讨论】:

    猜你喜欢
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2016-01-06
    相关资源
    最近更新 更多