2011-09-07 10 views
6

Poniżej znajduje się plik XML: book.xmlJak skutecznie przechowywać ten przeanalizowany dokument XML w bazie danych MySQL przy użyciu Pythona?

<?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> 

Poniżej kodu Pythona: 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) 

wyjściowe: ~/$ 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 . 

Moim celem jest przechowywanie książek w tabeli "Książki" i informacji o autorze w tabeli "Autorzy" (zachowując książkę -> relacje autora) [MySQL DB].

**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 
.... 

Jak mam przechowywać dane w bazie danych, jeśli mam kilka tysięcy książek i autorów (i rozdziałów)? Mam problem z jednoznacznym identyfikowaniem zbioru danych dla każdej książki/autora. Mogę używać identyfikatorów i przekazywać je do funkcji, aby zachować relację, ale nie jestem pewien, czy jest to najlepszy sposób, aby to zrobić. Wszelkie wskazówki są wysoko cenione.

p.s: Pracuję nad częścią SQL skryptu i zaktualizuję ją po jej przetestowaniu. Zapraszam do publikowania swoich myśli, próbek kodu. Dzięki!

+0

Niesamowite pytanie. –

+0

To interesujące pytanie, ale nie jestem pewien, czy faktyczne * pytanie * jest jasne. Szukasz wskazówek dotyczących projektowania relacyjnych baz danych, czy potrzebujesz pomocy z kodem do przetłumaczenia kodu XML na istniejący projekt bazy danych? – syrion

+0

Szukam pomocy z kodem Pythona, aby śledzić każdy unikalny rekord do przechowywania w bazie danych. Pomocny będzie nawet dyktafon lub lista w Pythonie - próbuję rozróżnić każdy rekord, analizując każdy węzeł. – ThinkCode

Odpowiedz

2

Na podstawie powyższego komentarza, po prostu utworzę klasę książki, klasę autora, listę autorów i klasę rozdziałów. Przypisz rozdziały książki do listy obiektów Rozdziałów w samej Książce. Utrzymuj listę autorów jako dyktando ich identyfikatorów, wskazując na faktyczne obiekty autorów. Użyj elementu danych obiektu Book, aby zawierał identyfikator; możesz podać metodę wyciągnięcia autora z dyktafonu AuthorList dla wygody.

+0

Dzięki za sugestię. Nie jestem dobrze zaznajomiony z lekcjami Pythona, wciąż się uczę. Na pewno spróbuję twojego podejścia. Nadmierne funkcje pomieszały mi z obsługą danych! – ThinkCode

Powiązane problemy