Database Reference
In-Depth Information
def
on
_
end
_
document()
puts
"TOTAL:
#{@count}
records inserted"
exit(1)
end
end
parser = XML::SaxParser.io(ARGF)
parser.callbacks = JamendoCallbacks.new
parser.parse
{
Zum Auftakt laden wir das
rubygems
-Modul und die benötigten Gems.
|
Standardmäßig nutzt man LibXML, indemman eine Callback-Klasse defi-
niert. Wir definieren eine
JamendoCallbacks
-Klasse, die unsere SAX-Hand-
ler für verschiedene Events kapselt.
}
Während der Initialisierung stellt unsere Klasse mit Hilfe der CourchRest-
API zuerst die Verbindung mit unserem lokalen CouchDB-Server her und
erzeugt dann die
music
-Datenbank (wenn sie nicht bereits existiert). Da-
nach werden einige Instanzvariablen eingerichtet, die Statusinformatio-
nen während des Parsings speichern. Beachten Sie, dass alle Dokumente
(und nicht nur die ersten 100) importiert werden, wenn Sie den
@max
-
Parameter auf
nil
setzen.
~
Sobald das Parsing begonnen hat, verarbeitet die
on
_
start
_
element()
-
Methode alle öffnenden Tags. Hier achten wir auf uns besonders interes-
sierende Tags wie
<artist>
,
<album>
,
<track>
und
<tag>
. Wir ignorieren
bewusst Container-Elemente -
<Artists>
,
<Albums>
,
<Tracks>
und
<Tags>
- und behandeln alle anderen als Properties, die für die nächstgelegenen
Container-Elemente gesetzt werden.
Sobald der Parser Zeichendaten erkennt, puffern wir sie, um sie dem
aktuellen Container-Element (dem Ende des
@stack
s) als Property hinzu-
zufügen.
Ein Großteil der interessanten Dinge passiert in der
on
_
end
_
element()
-
Methode. Hier schließen wir das aktuelle Container-Element, indem wir
es vom Stack entfernen. Schließt der Tag ein
artist
-Element, nutzen
wir die Gelegenheit, um das Dokument mit der
@db.save
_
doc()
-Methode
in CouchDB abzuspeichern. Jedem Container-Element fügen wir außer-
dem eine
random
-Property hinzu, die eine frisch generierte Zufallszahl ent-
hält. Wir nutzen diesen Wert später, um einen Titel, ein Album oder einen
Künstler zufällig auszuwählen.
Rubys
ARGF
-Stream kombiniert die Standardeingabe und alle in der Kom-
mandozeile angegebenen Dateien. Wir übergeben das an LibXML und ge-
ben eine Instanz unserer
JamendoCallbacks
-Klasse an, um die Tokens -
Start-Tags, End-Tags und Zeichendaten - zu verarbeiten.