2011-09-07 13 views
6

seguente è il file XML: book.xmlCome archiviare in modo efficiente questo documento XML analizzato nel database MySQL usando Python?

<?xml version="1.0" ?> 
<!--Sample XML Document--> 
<bookstore> 
    <book _id="E7854"> 
     <title> 
      Sample XML Book 
     </title> 
     <author> 
      <name _id="AU363"> 
     <first> 
      Benjamin 
     </first> 

     <last> 
      Smith 
     </last> 
      </name> 
      <affiliation> 
     A 
      </affiliation> 
     </author> 
     <chapter number="1"> 
      <title> 
     First Chapter 
      </title> 
      <para> 
     B 
     <count> 
      783 
     </count> 
     . 
      </para> 
     </chapter> 
     <chapter number="3"> 
      <title> 
     Third Chapter 
      </title> 
      <para> 
     B 
     <count> 
      59 
     </count> 
     . 
      </para> 
     </chapter> 
    </book> 
    <book _id="C843"> 
     <title> 
      XML Master 
     </title> 
     <author> 
      <name _id="AU245"> 
     <first> 
      John 
     </first> 

     <last> 
      Doe 
     </last> 
      </name> 
      <affiliation> 
     C 
      </affiliation> 
     </author> 
     <chapter number="2"> 
      <title> 
     Second Chapter 
      </title> 
      <para> 
     K 
     <count> 
      54 
     </count> 
     . 
      </para> 
     </chapter> 
     <chapter number="3"> 
      <title> 
     Third Chapter 
      </title> 
      <para> 
     K 
     <count> 
      328 
     </count> 
     . 
      </para> 
     </chapter> 
     <chapter number="7"> 
      <title> 
     Seventh Chapter 
      </title> 
      <para> 
     K 
     <count> 
      265 
     </count> 
     . 
      </para> 
     </chapter> 
     <chapter number="9"> 
      <title> 
     Ninth Chapter 
      </title> 
      <para> 
     K 
     <count> 
      356 
     </count> 
     . 
      </para> 
     </chapter> 
    </book> 
</bookstore> 

seguito è riportato il codice Python: book_dom.py

from xml.dom import minidom, Node 
import re, textwrap 

class SampleScanner: 
    def __init__(self, doc): 
     for child in doc.childNodes: 
      if child.nodeType == Node.ELEMENT_NODE and child.tagName == 'bookstore': 
       self.handleBookStore(child) 

    def gettext(self, nodelist): 
     retlist = [] 
     for node in nodelist: 
      if node.nodeType == Node.TEXT_NODE: 
       retlist.append(node.wholeText) 
      elif node.hasChildNodes: 
       retlist.append(self.gettext(node.childNodes)) 

     return re.sub('\s+', ' ', ''.join(retlist)) 

    def handleBookStore(self, node): 
     for child in node.childNodes: 
      if child.nodeType != Node.ELEMENT_NODE: 
       continue 
      if child.tagName == 'book': 
     self.handleBook(child) 

    def handleBook(self, node): 
     for child in node.childNodes: 
      if child.nodeType != Node.ELEMENT_NODE: 
       continue 
      if child.tagName == 'title': 
       print "Book title is:", self.gettext(child.childNodes) 
      if child.tagName == 'author': 
       self.handleAuthor(child) 
      if child.tagName == 'chapter': 
       self.handleChapter(child) 

    def handleAuthor(self, node): 
     for child in node.childNodes: 
      if child.nodeType != Node.ELEMENT_NODE: 
       continue 
      if child.tagName == 'name': 
       self.handleAuthorName(child) 
      elif child.tagName == 'affiliation': 
       print "Author affiliation:", self.gettext([child]) 

    def handleAuthorName(self, node): 
     surname = self.gettext(node.getElementsByTagName("last")) 
     givenname = self.gettext(node.getElementsByTagName("first")) 
     print "Author Name: %s, %s" % (surname, givenname) 

    def handleChapter(self, node): 
     print " *** Start of Chapter %s: %s" % (node.getAttribute('number'), 
      self.gettext(node.getElementsByTagName('title'))) 
     for child in node.childNodes: 
      if child.nodeType != Node.ELEMENT_NODE: 
       continue 
      if child.tagName == 'para': 
       self.handlePara(child) 

    def handlePara(self, node): 
     partext = self.gettext([node]) 
     partext = textwrap.fill(partext) 
     print partext 
     print 

doc = minidom.parse('book.xml') 
SampleScanner(doc) 

uscita: ~/$ python book_dom.py

Book ID : E7854 
Book title is: Sample XML Book 
Name ID : AU363 
Author Name: Smith , Benjamin 
Author affiliation: A 
*** Start of Chapter 1: First Chapter 
B 783 . 

*** Start of Chapter 3: Third Chapter 
B 59 . 

Book ID : C843 
Book title is: XML Master 
Name ID : AU245 
Author Name: Doe , John 
Author affiliation: C 
*** Start of Chapter 2: Second Chapter 
K 54 . 

*** Start of Chapter 3: Third Chapter 
K 328 . 

*** Start of Chapter 7: Seventh Chapter 
K 265 . 

*** Start of Chapter 9: Ninth Chapter 
K 356 . 

Il mio obiettivo è quello di memorizzare i libri nella tabella "Libri" e le informazioni dell'autore nella tabella "Autori" (preservando il libro -> relazione autore) [DB MySQL].

**Book table :** 
id |title 
E7854 Sample XML Book 
.... 

**Chapter table :** 
book_id|chapter_number|title  |para 
E7854 1    First Chapter B 783 . 
E7854 3    Third Chapter B 59 . 
.... 

**Author table :** 
id |book_id |name   |Affiliation 
AU363 E7854  Smith Benjamin A 
.... 

Come posso fare per la memorizzazione dei dati nel database se ho qualche migliaio di libri e autori (e capitoli)? Sto avendo problemi con l'identificazione univoca del set di dati per ogni libro/autore. Posso usare gli ID e passarli alle funzioni per preservare la relazione, ma non sono sicuro che sia il modo migliore per farlo. Qualsiasi suggerimento è molto apprezzato.

p.s: Sto lavorando sulla parte SQL dello script e si aggiornerà dopo averlo testato. Sentiti libero di postare i tuoi pensieri, esempi di codice. Grazie!

+0

Domanda stupenda. –

+0

Questa è una domanda interessante, ma non sono sicuro che l'attuale * domanda * sia chiara. Stai cercando indicazioni per la progettazione di database relazionali o vuoi aiuto con il codice per tradurre il tuo XML nella progettazione del tuo database esistente? – syrion

+0

Sto cercando aiuto con il codice Python per tenere traccia di ogni record univoco da memorizzare nel database. Anche un dict o una lista di Python aiuterà - Sto avendo difficoltà a cercare di differenziare ogni record mentre analizzo ogni nodo. – ThinkCode

risposta

2

Sulla base del tuo commento sopra, vorrei semplicemente creare una classe di libri, una classe di autore, una lista di autori e una classe capitolo. Assegna i capitoli del libro a un elenco di oggetti del capitolo sul Libro stesso. Mantieni la lista degli autori come una dict dei loro ID, indicando gli oggetti dell'autore. Utilizzare un membro dati dell'oggetto Book per contenere l'ID; puoi fornire un metodo per estrarre dall'autore dall'autore la dicitura AuthorList per comodità.

+0

Grazie per il suggerimento. Non sono esperto con le classi Python, sto ancora imparando. Proverò sicuramente il tuo approccio. Funzioni eccessive mi hanno confuso con la gestione dei dati! – ThinkCode

Problemi correlati