使用python将数据从xml文件填充到sqlite数据库

使用python将数据从xml文件填充到sqlite数据库,python,xml,database,sqlite,parsing,Python,Xml,Database,Sqlite,Parsing,我有一个关于解决问题的指导的问题。我有一个xml文件,我必须使用脚本语言Python将它填充到数据库系统中(不管怎样,它可能是sqlite、mysql) 有人知道如何进行吗 我需要进一步阅读哪些技术 我必须安装哪些环境 有关于同一主题的教程吗 我已经尝试在其他语言中使用基于树的方法和sax方法解析xml,但从Python开始,我不知道从哪里开始。我已经知道如何设计我需要的数据库 另一个问题是,仅Python可以执行数据库ddl查询吗?如果您习惯于从其他语言对xml进行DOM(树)访问,您可能

我有一个关于解决问题的指导的问题。我有一个xml文件,我必须使用脚本语言Python将它填充到数据库系统中(不管怎样,它可能是sqlite、mysql)

有人知道如何进行吗

  • 我需要进一步阅读哪些技术
  • 我必须安装哪些环境
  • 有关于同一主题的教程吗
我已经尝试在其他语言中使用基于树的方法和sax方法解析xml,但从Python开始,我不知道从哪里开始。我已经知道如何设计我需要的数据库


另一个问题是,仅Python可以执行数据库ddl查询吗?

如果您习惯于从其他语言对xml进行DOM(树)访问,您可能会发现这些标准库模块(及其各自的文档)很有用:

  • xml.dom
  • xml.dom.minidom
要将tha数据保存到DB,可以使用标准模块sqlite3或查找到mysql的绑定。或者您可能希望使用更抽象的东西,如SQLAlchemy或Django的ORM。

我建议您研究将XML文件解析到内存中的方法(解析所有XML文件,然后将其发送到SQL DB,可能更容易,但如果文件很大,元素树也允许增量操作)——它是标准Python库as模块的一部分

我推荐(也在标准Python库中)作为选择的关系数据库(如果您有选择的话),再次因为它方便且简单——底层SQLite嵌入式关系数据库也在中有很好的文档记录。如果您需要一个关于Python如何与关系数据库接口(“DB-API”)的通用教程,那么有一个不错的教程

一旦您完全理解了etree和sqlite3,您就不必为它们安装任何东西(这是它们魅力的一部分;-),您基本上已经准备好了。(当然是SQLite本身的安装(命令行和/或GUI工具)因此,您可以查看数据库文件并对其进行调整,图形XML编辑器(如或)也可以查看和/或调整XML,但这两种工具都不是必需的,与使用Python而不是其他语言进行XML解析和SQLite编写无关;-)


是的,您完全可以从
sqlite3
(以及任何其他符合DB-API的Python模块,如果您选择使用其他关系数据库;-)创建表
和其他DDL查询。

您可以使用
sqlite3
xmlstarlet
手动完成所有操作

  • 将xml转换为csv
  • 将csv导入数据库
(也许这不是你想要的,但很方便)

#xml文件的内容
$cat artist.xml
Ae2300d8b0232c06c莎拉 布莱曼(莎拉·布莱曼)悲伤的星期天莎拉 布莱曼(莎拉·布莱曼)Ae2300d8b0232c06c月光女神227.0 TrueTrueBef909D41922984ATRUEBB94FA21258A8B51我和你(2008年奥运会主题曲)(你和我)刘欢莎拉 布莱曼(莎拉·布莱曼)A6682d46bd4bdfc84Ae2300d8b0232c06c我和你 2008北京奥运会主题歌256.0真实BABF3AB3B7EF0E3EDTRUEFALSES 6A47788EF57FF87斯卡伯勒集市莎拉 布莱曼(莎拉·布莱曼)Ae2300d8b0232c06c月光女神251.0真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的假的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的莎拉 布莱曼(莎拉·布莱曼)AE2300D8B0232C06C交响乐:生活在维也纳275.0TrueTureB0187937A07B940F7TrueFalss7483CC8C44E06BB令人惊叹的优雅莎拉 布莱曼(莎拉·布莱曼)Ae2300d8b0232c06c真爱永恒 - 冬之歌186.0真的真的假的爱莎拉 布莱曼(莎拉·布莱曼)Ae2300d8b0232c06c月光女神371.0真的真的真的真的BF909D41922984ATRUEFLSCFB4989195B44E57和我在一起莎拉 布莱曼(莎拉·布莱曼)Ae2300d8b0232c06c月光女神324.0真正的真实BF909D41922984一个错误7BAFC588178B932CLA Lune莎拉 布莱曼(莎拉·布莱曼)Ae2300d8b0232c06c月光女神173.0真假真假BFEF909D41922984ATRUEFLSE
#使用xmlstarlet将xml转换为csv文件
$xml sel-t-m'//song'-v'concat(id,“,”,name,“,”,duration)'-n artist.xml | sed'$d'>artist.csv
#csv文件的内容
$cat artist.csv
Sa3f6b810d7f98646,阴郁的星期天,227.0
SBB94FA21258B51,我和你(2008年奥运会主题曲)(你和我),256.0
S6A47788BEF7FF87,斯卡伯勒集市,251.0
Sde1aa68da126ddfe,该说再见了,275.0
S7483CC8C44E06BB,神奇恩典,186.0
S2d9683c7230e18de,这份爱,371.0
Scfb4989195b44e57,和我在一起,324.0
S7bafc588178b932c,拉伦,173.0
#创建sqlite数据库
$sqlite3.db
sqlite>创建表歌曲(id、名称、持续时间);
#输入csv模式以导入csv文件
sqlite>.mode csv
sqlite>.import artist.csv歌曲
#检查一切是否正常
sqlite>.mode列
sqlite>上的.header
sqlite>从歌曲中选择*;
id名称持续时间
-----------------  -------------  ----------
Sa3f6b810d7f98646阴郁的星期日227.0
SBB94FA21258B51我和你(200  256.0
S6A47788BEF77FF87斯卡伯勒F 251.0
Sde1aa68da126ddfe表示G 275.0的时间
S7483CC8C44E06BB 186.0
S2d9683c7230e18de此爱371.0
Scfb4989195b44e57和我在一起324.0
S7bafc588178b932c拉伦173.0

我知道这是一篇老文章,但我认为值得一提,以供需要一次性解决方案的未来访问者参考:我发现的最简单的方法是使用Libre Office Calc,特别是
数据-->
XML源代码
功能

一旦导入ODS,就可以很容易地将其保存为CSV(即导入到SQLite),但在许多情况下,打开文档表本身就可以满足用户的需要,即使用
自动筛选功能
搜索和筛选数据。我处理15K行没有问题

如果任务必须重复执行,则必须编写脚本,Python库是一种很好的方法。但是,我在使用
xml.etree
时遇到了一些问题,在我的例子中,LibreOffice是
# content of xml file
$ cat artist.xml
<results><artist><id>Ae2300d8b0232c06c</id><name>莎拉 布莱曼(Sarah Brightman)</name><hotSongs><!--freemusic/song/result/Sa3f6b810d7f98646--><song><id>Sa3f6b810d7f98646</id><name>Gloomy Sunday</name><artist>莎拉 布莱曼(Sarah Brightman)</artist><artistId>Ae2300d8b0232c06c</artistId><album>月光女神</album><duration>227.0</duration><canBeDownloaded>true</canBeDownloaded><hasFullLyrics>true</hasFullLyrics><canBeStreamed>true</canBeStreamed><albumId>Bfef909d41922984a</albumId><hasSimilarSongs>true</hasSimilarSongs><hasRecommendation>false</hasRecommendation></song><!--freemusic/song/result/Sbb94fa21258a8b51--><song><id>Sbb94fa21258a8b51</id><name>我和你(2008年奥运会主题曲)(You And Me)</name><artist>刘欢</artist><artist>莎拉 布莱曼(Sarah Brightman)</artist><artistId>A6682d46bd4bdfc84</artistId><artistId>Ae2300d8b0232c06c</artistId><album>我和你 2008北京奥运会主题歌</album><duration>256.0</duration><canBeDownloaded>true</canBeDownloaded><hasFullLyrics>true</hasFullLyrics><canBeStreamed>true</canBeStreamed><albumId>Babf3ab3b7ef0e3ed</albumId><hasSimilarSongs>true</hasSimilarSongs><hasRecommendation>false</hasRecommendation></song><!--freemusic/song/result/S6a47788bef57ff87--><song><id>S6a47788bef57ff87</id><name>Scarborough Fair</name><artist>莎拉 布莱曼(Sarah Brightman)</artist><artistId>Ae2300d8b0232c06c</artistId><album>月光女神</album><duration>251.0</duration><canBeDownloaded>true</canBeDownloaded><hasFullLyrics>true</hasFullLyrics><canBeStreamed>true</canBeStreamed><albumId>Bfef909d41922984a</albumId><hasSimilarSongs>true</hasSimilarSongs><hasRecommendation>false</hasRecommendation></song><!--freemusic/song/result/Sde1aa68da126ddfe--><song><id>Sde1aa68da126ddfe</id><name>Time To Say Goodbye</name><artist>莎拉 布莱曼(Sarah Brightman)</artist><artistId>Ae2300d8b0232c06c</artistId><album>Symphony: Live In Vienna</album><duration>275.0</duration><canBeDownloaded>true</canBeDownloaded><hasFullLyrics>true</hasFullLyrics><canBeStreamed>true</canBeStreamed><albumId>B0187937a07b940f7</albumId><hasSimilarSongs>true</hasSimilarSongs><hasRecommendation>false</hasRecommendation></song><!--freemusic/song/result/S7483cc8c44e06bbb--><song><id>S7483cc8c44e06bbb</id><name>Amazing Grace</name><artist>莎拉 布莱曼(Sarah Brightman)</artist><artistId>Ae2300d8b0232c06c</artistId><album>真爱永恒 - 冬之歌</album><duration>186.0</duration><canBeDownloaded>true</canBeDownloaded><hasFullLyrics>true</hasFullLyrics><canBeStreamed>true</canBeStreamed><albumId>B38e85a3056c0381c</albumId><hasSimilarSongs>true</hasSimilarSongs><hasRecommendation>false</hasRecommendation></song><!--freemusic/song/result/S2d9683c7230e18de--><song><id>S2d9683c7230e18de</id><name>This Love</name><artist>莎拉 布莱曼(Sarah Brightman)</artist><artistId>Ae2300d8b0232c06c</artistId><album>月光女神</album><duration>371.0</duration><canBeDownloaded>true</canBeDownloaded><hasFullLyrics>true</hasFullLyrics><canBeStreamed>true</canBeStreamed><albumId>Bfef909d41922984a</albumId><hasSimilarSongs>true</hasSimilarSongs><hasRecommendation>false</hasRecommendation></song><!--freemusic/song/result/Scfb4989195b44e57--><song><id>Scfb4989195b44e57</id><name>Here With Me</name><artist>莎拉 布莱曼(Sarah Brightman)</artist><artistId>Ae2300d8b0232c06c</artistId><album>月光女神</album><duration>324.0</duration><canBeDownloaded>true</canBeDownloaded><hasFullLyrics>true</hasFullLyrics><canBeStreamed>true</canBeStreamed><albumId>Bfef909d41922984a</albumId><hasSimilarSongs>true</hasSimilarSongs><hasRecommendation>false</hasRecommendation></song><!--freemusic/song/result/S7bafc588178b932c--><song><id>S7bafc588178b932c</id><name>La Lune</name><artist>莎拉 布莱曼(Sarah Brightman)</artist><artistId>Ae2300d8b0232c06c</artistId><album>月光女神</album><duration>173.0</duration><canBeDownloaded>true</canBeDownloaded><hasFullLyrics>false</hasFullLyrics><canBeStreamed>true</canBeStreamed><albumId>Bfef909d41922984a</albumId><hasSimilarSongs>true</hasSimilarSongs><hasRecommendation>false</hasRecommendation></song></hotSongs></artist></results>

# convert xml to csv file using xmlstarlet
$ xml sel -t -m '//song' -v 'concat(id, ",", name, ",", duration)' -n artist.xml | sed '$d' >artist.csv

# content of csv file
$ cat artist.csv
Sa3f6b810d7f98646,Gloomy Sunday,227.0
Sbb94fa21258a8b51,我和你(2008年奥运会主题曲)(You And Me),256.0
S6a47788bef57ff87,Scarborough Fair,251.0
Sde1aa68da126ddfe,Time To Say Goodbye,275.0
S7483cc8c44e06bbb,Amazing Grace,186.0
S2d9683c7230e18de,This Love,371.0
Scfb4989195b44e57,Here With Me,324.0
S7bafc588178b932c,La Lune,173.0

# create sqlite database
$ sqlite3 song.db
sqlite> CREATE TABLE song(id, name, duration);

# enter csv mode to import csv file
sqlite> .mode csv
sqlite> .import artist.csv song

# check everything is ok
sqlite> .mode column
sqlite> .header on
sqlite> select * from song;
id                 name           duration
-----------------  -------------  ----------
Sa3f6b810d7f98646  Gloomy Sunday  227.0
Sbb94fa21258a8b51  我和你(200  256.0
S6a47788bef57ff87  Scarborough F  251.0
Sde1aa68da126ddfe  Time To Say G  275.0
S7483cc8c44e06bbb  Amazing Grace  186.0
S2d9683c7230e18de  This Love      371.0
Scfb4989195b44e57  Here With Me   324.0
S7bafc588178b932c  La Lune        173.0