this is the code i wrote, data are in all the table except Genre, i am using sqlite to execute
import xml.etree.ElementTree as ET
import sqlite3
conn = sqlite3.connect('trackdb.sqlite')
cur = conn.cursor()
cur.executescript('''
DROP TABLE IF EXISTS Artist;
DROP TABLE IF EXISTS Genre;
DROP TABLE IF EXISTS Album;
DROP TABLE IF EXISTS Track;
CREATE TABLE Artist (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT UNIQUE
);
CREATE TABLE Genre (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT UNIQUE
);
CREATE TABLE Album (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
artist_id INTEGER,
title TEXT UNIQUE
);
CREATE TABLE Track (
id INTEGER NOT NULL PRIMARY KEY
AUTOINCREMENT UNIQUE,
title TEXT UNIQUE,
album_id INTEGER,
genre_id INTEGER,
len INTEGER, rating INTEGER, count INTEGER
);
''')
fname = input('Enter file name: ')
if ( len(fname) < 1 ) : fname = 'Library.xml'
def lookup(d, key):
found = False
for child in d:
if found : return child.text
if child.tag == 'key' and child.text == key :
found = True
return None
stuff = ET.parse(fname)
all = stuff.findall('dict/dict/dict')
print('Dict count:', len(all))
for entry in all:
if ( lookup(entry, 'Track ID') is None ) : continue
name = lookup(entry, 'Name')
artist = lookup(entry, 'Artist')
album = lookup(entry, 'Album')
count = lookup(entry, 'Play Count')
rating = lookup(entry, 'Rating')
length = lookup(entry, 'Total Time')
if name is None or artist is None or album is None :
continue
print(name, artist, album, count, rating, length)
cur.execute('''INSERT OR IGNORE INTO Artist (name)
VALUES ( ? )''', ( artist, ) )
cur.execute('SELECT id FROM Artist WHERE name = ? ', (artist, ))
artist_id = cur.fetchone()[0]
cur.execute('''INSERT OR IGNORE INTO Album (title, artist_id)
VALUES ( ?, ? )''', ( album, artist_id ) )
cur.execute('SELECT id FROM Album WHERE title = ? ', (album, ))
album_id = cur.fetchone()[0]
cur.execute('''INSERT OR REPLACE INTO Track
(title, album_id, len, rating, count)
VALUES ( ?, ?, ?, ?, ? )''',
( name, album_id, length, rating, count ) )
conn.commit()
What I have tried:
this is the correction chat gtp gave me but it didnt solve the problem.
# ... (previous code)
def parse_xml_and_insert():
conn = sqlite3.connect("trackdb.sqlite")
cur = conn.cursor()
xml_data = ET.parse("Library.xml")
all_tracks = xml_data.findall("dict/dict/dict")
for track in all_tracks:
title = None
artist = None
genre = None
album = None
count = None
rating = None
length = None
for i in range(0, len(track) - 1, 2):
if track[i].text == "Name":
title = track[i + 1].text
elif track[i].text == "Artist":
artist = track[i + 1].text
elif track[i].text == "Genre":
genre = track[i + 1].text
elif track[i].text == "Album":
album = track[i + 1].text
elif track[i].text == "Total Time":
length = int(track[i + 1].text) // 1000
elif track[i].text == "Rating":
rating = int(track[i + 1].text)
elif track[i].text == "Play Count":
count = int(track[i + 1].text)
if title is None or artist is None or album is None:
continue
if genre is None:
genre = "Unknown"
print(title, artist, album, genre, count, rating, length)
cur.execute("INSERT OR IGNORE INTO Artist (name) VALUES (?)", (artist,))
cur.execute("SELECT id FROM Artist WHERE name = ?", (artist,))
artist_id = cur.fetchone()[0]
cur.execute("INSERT OR IGNORE INTO Genre (name) VALUES (?)", (genre,))
cur.execute("SELECT id FROM Genre WHERE name = ?", (genre,))
genre_id = cur.fetchone()[0]
cur.execute("INSERT OR IGNORE INTO Album (title, artist_id) VALUES (?, ?)", (album, artist_id))
cur.execute("SELECT id FROM Album WHERE title = ?", (album,))
album_id = cur.fetchone()[0]
cur.execute('''INSERT OR REPLACE INTO Track
(title, album_id, genre_id, len, rating, count)
VALUES (?, ?, ?, ?, ?, ?)''',
(title, album_id, genre_id, length, rating, count))
conn.commit()
conn.close()