ich versuche seit einiger Zeit mithilfe von XML Informationen aus einer Open-Office-Tabelle zu extrahieren. Dazu muss ich die Tabelle Zeilenweise parsen und den Inhalt jeder Zeile in eine eigene Liste füllen. WIe das genau aussehen soll, ist jedoch eher unerheblich.
Das Problem ist folgendes: Ich habe ein vorgefertigtes XML-Parserscript aus dem Netz gefischt, dieses Script ignoriert nun leider doppelte Werte in einer Zeile. Wenn also zwei Zellen nebeneinander denselben Wert haben, werden einfach alle Dopplungen ausgelassen.
Hier ist das Script:
Code: Alles auswählen
#!/usr/bin/env python
# import the needed modules
import zipfile
import xml.parsers.expat
# get content xml data from OpenDocument file
ziparchive = zipfile.ZipFile("laufwerke.ods", "r")
xmldata = ziparchive.read("content.xml")
ziparchive.close()
class Element(list):
def __init__(self, name, attrs):
self.name = name
self.attrs = attrs
class TreeBuilder:
def __init__(self):
self.root = Element("root", None)
self.path = [self.root]
def start_element(self, name, attrs):
element = Element(name, attrs)
self.path[-1].append(element)
self.path.append(element)
def end_element(self, name):
assert name == self.path[-1].name
self.path.pop()
def char_data(self, data):
self.path[-1].append(data)
# create parser and parsehandler
parser = xml.parsers.expat.ParserCreate()
treebuilder = TreeBuilder()
# assign the handler functions
parser.StartElementHandler = treebuilder.start_element
parser.EndElementHandler = treebuilder.end_element
parser.CharacterDataHandler = treebuilder.char_data
# parse the data
parser.Parse(xmldata, True)
def showtree(node, prefix=""):
#print prefix, node.name
if node.name == "table:table-row":
print "Neue Zeile:"
for e in node:
if isinstance(e, Element):
showtree(e, prefix + " ")
else:
print e
showtree(treebuilder.root)
[img=http://img526.imageshack.us/img526/9940 ... do0.th.png]
Hier ist die Ausgabe des Scripts für die ersten Zwei Zeilen:
Wie man sieht, müsste die Ausgabe für die zweite Zeile länger sein, weil wesentlich mehr NULL-Werte hintereinander stehen. Woran könnte das liegen?Neue Zeile:
ID
Name
CPU
Grafikkarte
Mainboard
Ram
HDD
Kuehler
Netzteil
Laufwerk
Preis
NB-LW
Cardreader
Floppy
Lightscripe
DVD - s
DVD - l
HD-DVD
Blue-Ray - s
Blue-Ray - l
Watt
kuehler S A
kuehler S 478
kuehler S 939
kuehler S 940
kuehler S 754
kuehler S 775
kuehler S AM2
kuehler S AM2+
zoll
Kapazität
speed
zugriffszeit
cache
NCQ
sockel anz
sockel
Takt
L1 Cache
L2 Cache
L3 Cache
FSB/HT
EE
Virtualisierung
MMX
SSE
CnQ
NX-Bit
3dNow!
Bit
Cores
Gewaehrleistung
Garantie
Marke
luefter strom
ATX
Micro ATX
Firewire
Sound
Lan
Lan geschw
USB typ
USB
SATA
IDE
DDR
DDR2
Chipsatz
PCI
PCIx1
PCIx16
DirectX
Kuehler sockel
gb-ram
Grakaname
Kuehler
Kuehler sockel
sockel
sockel anz
CPU
Netzteil
Ram
HDD
luefter strom
ATX
micro ATX
graka
USB
Firewire
eSATA
SATA
IDE
LAN
USB
Neue Zeile:
261010071
LG GSA-T20N Dual-DVD-+R
NULL
1
54,99
1
NULL
1
NULL
NULL
1
NULL
Mit freundlichen Grüßen,
Karl Kröber aka Dr_Enquinox