заполнение данных из XML-файла в базу данных sqlite с использованием Python - PullRequest
7 голосов
/ 18 января 2010

У меня есть вопрос, касающийся некоторых указаний по решению проблемы. У меня есть XML-файл, я должен заполнить его системой баз данных (независимо от того, что это может быть sqlite, mysql), используя язык сценариев: Python.

Кто-нибудь знает, как поступить?

  • Какие технологии мне нужно читать дальше?
  • Какие среды мне нужно установить?
  • Есть ли уроки на ту же тему?

Я уже пытался анализировать xml, используя древовидный метод и метод sax на другом языке, но чтобы начать с Python, я не знаю, с чего начать. Я уже знаю, как спроектировать нужную мне базу данных.

Другой вопрос, возможен ли только Python для выполнения запросов к базе данных ddl?

Ответы [ 3 ]

10 голосов
/ 18 января 2010

Я рекомендую вам изучить ElementTree для парсинга вашего XML-файла в память (проанализировать все, а затем передать все это в базу данных SQL, возможно, проще, но дерево элементов также допускает инкрементную операцию, если ваш файл огромен) - это часть стандартной библиотеки Python в виде модуля xml.etree .

Я рекомендую sqlite3 (также в стандартной библиотеке Python) в качестве предпочтительной реляционной БД (если у вас есть выбор), опять же, потому что это удобно и просто - базовая встроенная реляционная БД SQLite также хорошо документировано на своем сайте . Если вам нужен общий учебник о том, как Python любит взаимодействовать с реляционными БД («DB-API»), есть хороший здесь .

Как только вы полностью понимаете etree и sqlite3 - и вам не обязательно устанавливать любую вещь для чего-либо (что является частью их чар ;-) - вы в основном все готово. (Конечно, установка самого SQLite (инструменты командной строки и / или GUI), чтобы вы могли просматривать файлы БД и настраивать их, может быть полезна, как и графические XML-редакторы, такие как oXygen или XMLmind для просмотра и / или настройки вашего XML, но ни один из инструментов вообще не нужен необходим , совсем не связанный с использованием Python, а не с другими языками для синтаксического анализа XML и написания SQLite ;-) .

И да, вы можете прекрасно выполнять CREATE TABLE и другие DDL-запросы из sqlite3 (и любого другого модуля Python, совместимого с DB-API, если вы решите использовать другие реляционные БД; -).

6 голосов
/ 08 ноября 2011

Вы можете сделать все вручную с помощью sqlite3 и xmlstarlet.

  • конвертировать XML в CSV
  • импорт CSV в БД.

(Может быть, это не ваше желание. Но это удобно)

# 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
1 голос
/ 18 января 2010

Если вы привыкли к DOM (древовидному) доступу к xml с другого языка, вам могут пригодиться следующие стандартные библиотечные модули (и соответствующие документы):

  • xml.dom
  • xml.dom.minidom

Чтобы сохранить данные в БД, вы можете использовать стандартный модуль sqlite3 или искать привязку к mysql.Или вы можете захотеть использовать что-то более абстрактное, например, SQLAlchemy или ORM Джанго.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...