Leonidas hat geschrieben:Davon abgesehen fehlt ein root-Element. Gut möglich, dass es weggelassen wurde.
Ich hab <Media> dafür gehalten...
Leonidas hat geschrieben:Okay, ProgChild gib uns ein Beispiel mit minidom, ich kann es jetzt noch nicht. Allerdings hatte ich sowieso vor eine Version mit XML-Parser so zur Übung zu schreiben, jedoch kann das noch etwas dauern, da ich mich erstmal reinlesen muss.
Ich halte hier Expat für angebrachter, weil wir nur lesen und nicht unbedingt die Ganze Tabelle in den RAM laden müssen. Darum hier ein Beispiel mit Expat.
Unter test.xml gespeichert:
Code: Alles auswählen
<?xml version="1.0"?>
<Media>
<Name>CD Nummer 1</Name>
<Table>
<URL>Test.ASC</URL>
<Name>daten</Name>
<Description>...</Description>
<!-- Spezifiziert den Dezimaltrenner -->
<DecimalSymbol>,</DecimalSymbol>
<SkipNumBytes>97</SkipNumBytes>
<FixedLength>
<FixedColumn>
<Name>NUMMER</Name>
<Numeric/>
<FixedRange>
<From>97</From>
<Length>4</Length>
</FixedRange>
</FixedColumn>
<FixedColumn>
<Name>Name</Name>
<AlphaNumeric/>
<FixedRange>
<From>101</From>
<Length>12</Length>
</FixedRange>
</FixedColumn>
</FixedLength>
</Table>
</Media>
Und der script:
Code: Alles auswählen
import xml.parsers.expat
class Reader:
def read( self, filename ):
self.query = 'CREATE TABLE '
self.path = []
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = self.start_element
p.EndElementHandler = self.end_element
p.CharacterDataHandler = self.char_data
f = open( filename, 'r' )
p.ParseFile( f )
f.close()
def start_element( self, name, attrs):
path = "/" . join( self.path )
if path == 'Media/Table/FixedLength/FixedColumn':
if name == 'Numeric':
self.query += "INTEGER("
if name == 'AlphaNumeric':
self.query += "VARCHAR("
self.path.append( name )
self.cur_data = ''
def end_element( self, name):
path = "/" . join( self.path )
if path == 'Media/Table/Name':
self.query += self.cur_data + "\n(\n"
if path == 'Media/Table/FixedLength/FixedColumn/Name':
self.query += self.cur_data + " "
if path == 'Media/Table/FixedLength/FixedColumn' + \
'/FixedRange/Length':
self.query += self.cur_data
if path == 'Media/Table/FixedLength/FixedColumn':
self.query += "),\n"
if path == 'Media/Table':
self.query += ");\n"
del self.path[-1]
def char_data( self, data):
self.cur_data += data
def get_query( self ):
return self.query
r = Reader()
r.read( 'test.xml' )
print r.get_query()
Leonidas, ich wollte weder dein Script noch dich nicht kritisieren. Du verbringst hier sehr viel Zeit, was ich sehr gut finde. Normalerweise ist es ja nicht Sinn des Forums, die Aufgaben der anderen Leute hier zu lösen, sondern sie dabei zu unterstüzen, aber ich hab das mal als herausforderung genommen. Expat hab ich noch nie vorher benutzt, minidom zwar schon, das ist hier aber nicht so geeignet.