MySQL 5.6 LOAD XML LOCAL INFILE和空的XML元素

我有大量合理大小的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文件。

希望这有助于某人。