Welchen XML Parser?
Verfasst: Samstag 5. September 2009, 11:49
Hi, ich möchte eine etwas komplexere XML Datei einlesen, bestimmte Sachen herausfiltern und zusammenfassen und anschließend in eine neue XML Datei ausgeben. Ich wollte eigentlich ElementTree verwenden, weil es mir speziell unter Python am einfachsten erscheint. Bin mir aber nicht sicher, ob ET dafür wirklich optimal ist und ich hab auch leichte Bedenken, weil ET Python Only ist. Es kann sein, dass ich das später mal nach C oder C++ portieren muss.
Hier mal ein Auszug
Die XML Datei enthält zwei Teile. Der zweite Teil beginnt ab <V2>. In beiden Teilen befinden sich ähnliche Informationen zu den gleichen Elementen, teilweise redundant. Ich möchte jetzt aus beiden Teilen die nötigen Informationen zusammenfassen und in einer neuen Datei ausgeben.
Bevor ich mich jetzt in das Studium von ElementTree stürze und nachher alles umsonst war frage ich vorher lieber, ob DOM, SAX oder was auch immer besser geeignet wäre.
Hier mal ein Auszug
Code: Alles auswählen
<?xml version="1.0"?>
<AVRPART>
<MODULE_LIST>[ADMIN:CORE:INTERRUPT_VECTOR:MEMORY:PACKAGE:POWER:PROGVOLT:LOCKBIT:FUSE:PROGRAMMING:IO_MODULE:ICE_SETTINGS]</MODULE_LIST>
[..]
<FUSE>
<LIST>[LOW:HIGH]</LIST>
<ID/>
<ICON/>
<TEXT/>
<LOW>
<NMB_FUSE_BITS>8</NMB_FUSE_BITS>
<FUSE7>
<NAME>BODLEVEL</NAME>
<TEXT>Brown out detector trigger level</TEXT>
<DEFAULT>1</DEFAULT>
</FUSE7>
<FUSE6>
<NAME>BODEN</NAME>
<TEXT>Brown out detector enable</TEXT>
<DEFAULT>1</DEFAULT>
</FUSE6>
<FUSE5>
<NAME>SUT1</NAME>
<TEXT>Select start-up time</TEXT>
<DEFAULT>0</DEFAULT>
</FUSE5>
<FUSE4>
<NAME>SUT0</NAME>
<TEXT>Select start-up time</TEXT>
<DEFAULT>0</DEFAULT>
</FUSE4>
<FUSE3>
<NAME>CKSEL3</NAME>
<TEXT>Select Clock Source</TEXT>
<DEFAULT>0</DEFAULT>
</FUSE3>
<FUSE2>
<NAME>CKSEL2</NAME>
<TEXT>Select Clock Source</TEXT>
<DEFAULT>0</DEFAULT>
</FUSE2>
<FUSE1>
<NAME>CKSEL1</NAME>
<TEXT>Select Clock Source</TEXT>
<DEFAULT>0</DEFAULT>
</FUSE1>
<FUSE0>
<NAME>CKSEL0</NAME>
<TEXT>Select Clock Source</TEXT>
<DEFAULT>1</DEFAULT>
</FUSE0>
<NMB_TEXT>61</NMB_TEXT>
<TEXT1>
<MASK>0x80</MASK>
<VALUE>0x00</VALUE>
<TEXT>Brown-out detection level at VCC=4.0 V; [BODLEVEL=0]</TEXT>
</TEXT1>
<TEXT2>
<MASK>0x80</MASK>
<VALUE>0x80</VALUE>
<TEXT>Brown-out detection level at VCC=2.7 V; [BODLEVEL=1]</TEXT>
</TEXT2>
<TEXT3>
<MASK>0x40</MASK>
<VALUE>0x00</VALUE>
<TEXT>Brown-out detection enabled; [BODEN=0]</TEXT>
</TEXT3>
<TEXT4>
<MASK>0x3F</MASK>
<VALUE>0x00</VALUE>
<TEXT>Ext. Clock; Start-up time: 6 CK + 0 ms; [CKSEL=0000 SUT=00]</TEXT>
</TEXT4>
[..]
<V2>
<templates>
<module class="FUSE">
<registers name="FUSE" memspace="FUSE">
<reg size="1" name="HIGH" offset="0x01">
<bitfield name="RSTDISBL" mask="0x80" text="Reset Disabled (Enable PC6 as i/o pin)" icon=""/>
<bitfield name="WTDON" mask="0x40" text="Watch-dog Timer always on" icon=""/>
<bitfield name="SPIEN" mask="0x20" text="Serial program downloading (SPI) enabled" icon=""/>
<bitfield name="EESAVE" mask="0x08" text="Preserve EEPROM through the Chip Erase cycle" icon=""/>
<bitfield name="BOOTSZ" mask="0x06" text="Select Boot Size" icon="" enum="ENUM_BOOTSZ"/>
<bitfield name="BOOTRST" mask="0x01" text="Boot Reset vector Enabled" icon=""/>
<bitfield name="CKOPT" mask="0x10" text="CKOPT fuse (operation dependent of CKSEL fuses)" icon=""/>
</reg>
<reg size="1" name="LOW" offset="0x00">
<bitfield name="BODLEVEL" mask="0x80" text="Brown out detector trigger level" icon="" enum="ENUM_BODLEVEL"/>
<bitfield name="BODEN" mask="0x40" text="Brown-out detection enabled" icon=""/>
<bitfield name="SUT_CKSEL" mask="0x3F" text="Select Clock Source" icon="" enum="ENUM_SUT_CKSEL"/>
</reg>
</registers>
<enumerator name="ENUM_BODLEVEL">
<enum val="0x00" text="Brown-out detection at VCC=4.0 V"/>
<enum val="0x01" text="Brown-out detection at VCC=2.7 V"/>
</enumerator>
<enumerator name="ENUM_SUT_CKSEL">
<enum val="0x00" text="Ext. Clock; Start-up time: 6 CK + 0 s"/>
<enum val="0x10" text="Ext. Clock; Start-up time: 6 CK + 4 ms"/>
<enum val="0x20" text="Ext. Clock; Start-up time: 6 CK + 64 ms"/>
<enum val="0x01" text="Int. RC Osc. 1 MHz; Start-up time: 6 CK + 0 ms"/>
<enum val="0x11" text="Int. RC Osc. 1 MHz; Start-up time: 6 CK + 4 ms"/>
<enum val="0x21" text="Int. RC Osc. 1 MHz; Start-up time: 6 CK + 64 ms; default value"/>
<enum val="0x02" text="Int. RC Osc. 2 MHz; Start-up time: 6 CK + 0 ms"/>
<enum val="0x12" text="Int. RC Osc. 2 MHz; Start-up time: 6 CK + 4 ms"/>
<enum val="0x22" text="Int. RC Osc. 2 MHz; Start-up time: 6 CK + 64 ms"/>
[..]
</V2>
</AVRPART>
Bevor ich mich jetzt in das Studium von ElementTree stürze und nachher alles umsonst war frage ich vorher lieber, ob DOM, SAX oder was auch immer besser geeignet wäre.