Seite 1 von 1

Welchen XML Parser?

Verfasst: Samstag 5. September 2009, 11:49
von burli
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

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

Verfasst: Samstag 5. September 2009, 12:00
von Hyperion
Wenn Du Dinge wie XPath nutzen willst, um Knoten zu finden, dann bietet sich vor allem noch lxml an. Das bietet neben der ElementTree-API noch vieles mehr.

Generell würde ich Dir zu ElementTree raten. DOM war ein netter Versuch, das XML Parsen möglichst Sprach unabhängig zu gestalten. Leider führt das oftmals dazu, dass Sprach spezifische Konstrukte nicht genutzt werden können, obwohl das wesentlich eleganterer und einfachrer Code wäre. Genau an dieser Stelle setzt ElementTree an.

Bei einer Portierung müßtest Du vermutlich aber eh viel neu schreiben, auch wenn Du DOM unter Python nutzt. Insofern entwickle es jetzt eben mit der besten Lib, anstatt sich auf DOM zu versteifen, wenn ja noch nicht klar ist, ob man den Code denn wirklich noch einmal portieren muss.

Im übrigen kann man Python ja durchaus in C und auch C++ einbinden - dann bräuchte man die Parsing-Routinen sogar nicht mal mehr umschreiben.

Verfasst: Samstag 5. September 2009, 12:23
von burli
Ok, dann werde ich das mal so tun. XPath wäre das Stichwort, mit dem ich weiter machen müsste? Was könnt ihr mir als Einstiegslektüre empfehlen? Ich bin noch absoluter Noob in XML Verarbeitung :roll: