使用未转义的&符号将无效的XML文件(1.5G)导入MySQL

时间:2013-05-05 19:43:47

标签: php mysql xml xmlreader ampersand

我无法将我的大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);

                }
}

如果此代码读取元素<number>111&111</number>,则表示出错。我可以使用命令行工具删除此&符号,但我的内存非常大的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进行跳过验证?

1 个答案:

答案 0 :(得分:0)

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

免责声明:我与供应商有联系。