我有大量合理大小的XML文件,我想导入到MySQL表中。 我运行的是Centos 6.3和MySQL 5.6,我最初尝试过5.5,但是遇到了问题,后来发现5.5中有一个关于空XML标签的bug,所以在5.6版本中已经解决了这个问题。
XML文件本身包含一些我不感兴趣的元素,所以数据插入到的表中包含的字段比XML文件中的元素less得多,但据我所知,这不应该是一个问题。 所有的字段名称都对应于XML文件中的元素名称。
我有这张桌子
CREATE TABLE `products` ( `sku` BIGINT(20) UNSIGNED NOT NULL, `productId` BIGINT(20) UNSIGNED NOT NULL, `name` VARCHAR(250) NULL, `type` VARCHAR(250) NULL, `format` VARCHAR(250) NULL, `albumTitle` VARCHAR(250) NULL, `artistName` VARCHAR(250) NULL, `upc` BIGINT(15) UNSIGNED NULL, `shortDescription` TEXT NULL, `image` VARCHAR(100) NULL, INDEX `Index 1` (`productId`), INDEX `Index 2` (`name`), INDEX `Index 3` (`type`), INDEX `Index 4` (`format`) )
XML是格式
<products> <product> ... </product> ... </products>
我正在使用它来插入数据
LOAD XML LOCAL INFILE 'filename.xml' INTO TABLE products ROWS IDENTIFIED BY '<product>';
正在插入正确数量的行,但是数据库中的所有字段都不包含任何内容或NULL。 这看起来与我看到5.5是相同的问题,其中包含空标记(例如<sku />
而不是<sku></sku>
XML不会被处理并导致这种结果。
我想我的问题是有什么我可以做,以防止这种行为。 我正确地做这个?
我曾想过试图find并replace所有空标签,但这在我的Linux知识中是超出了我的知识,所以也许这是一个select,有人可以提出一个方法来实现它,这将是一个很大的帮助,但任何帮助将不胜感激。
要回答我自己的问题,并在其他人遇到此问题的情况下,我所做的是创建一个简单的bash脚本从每个文件中删除任何空的节点。 我称之为clean.sh的bash脚本包含以下内容
for file in *xml do echo "Processing $file" sed 's/<.*\/>//g' $file > tt mv tt processed/${file} done
请注意,我创建了一个名为“processed”的新目录,其中放置了已处理的文件。
要运行脚本(假设您的当前位置是脚本所在的位置),您只需运行即可
sh clean.sh
运行相同的SQL查询之后:
LOAD XML LOCAL INFILE 'filename.xml' INTO TABLE products ROWS IDENTIFIED BY '<product>';
正确的数据被导入到数据库表中。 对我来说,下一步是创建另一个bash脚本来导入所有的XML文件。
希望这有助于某人。