2013-04-17 50 views
2

我有大量合理大小的XML文件,我想導入到MySQL表中。我運行的是Centos 6.3和MySQL 5.6,我最初嘗試過5.5,但遇到了問題,後來發現5.5中有一個關於空XML標籤的錯誤,所以我認爲這已經在5.6中解決了。MySQL 5.6 LOAD XML LOCAL INFILE和空的XML元素

XML文件本身包含一些我不感興趣的元素,所以插入數據的表包含的字段比XML文件中的元素少得多,但據我所知,這應該這不是一個問題。所有的字段名稱都對應於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>'; 

的正確的行數是bei ng插入,但數據庫中的所有字段均不包含任何內容或NULL。這看起來與我在5.5中看到的問題是一樣的,其中包含空標籤的XML例如<sku />而不是<sku></sku>不處理並導致這種結果。

我想我的問題是有什麼我可以做,以防止這種行爲。我是否正確地做這件事?

我曾想過試圖找到並替換所有空標籤,但這在我的Linux知識中超出了我的知識,所以也許這是一種選擇,有人可以提出一種實現方法,這將是一個很大的幫助,但任何幫助都會非常感謝。

+0

也許與http://bugs.mysql.com/bug.php?id=67439 –

回答

2

要回答我自己的問題,並在其他人遇到此問題的情況下,我所做的就是創建一個簡單的bash腳本以從每個文件中刪除任何空節點。在bash腳本我叫clean.sh,它包含以下

for file in *xml 
do 
     echo "Processing $file" 
     sed 's/<.*\/>//g' $file > tt 
     mv tt processed/${file} 
done 

注意,我創建了一個名爲新目錄「處理」,其中已處理文件放置。

要運行腳本(假設你的當前位置是腳本所在),你會運行

sh clean.sh 

運行相同的SQL查詢後:

LOAD XML LOCAL INFILE 'filename.xml' INTO TABLE products ROWS IDENTIFIED BY '<product>'; 

正確導入數據到數據庫表中。對我來說,下一步是創建另一個bash腳本來導入所有的XML文件。

希望這可以幫助別人。