Ankündigung

Einklappen
Keine Ankündigung bisher.

Welche XML-Bibliothek für Plugins?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Welche XML-Bibliothek für Plugins?

    Hallo,

    hier scheitere ich gerade ein wenig an minidom:
    https://knx-user-forum.de/smarthome-...interesse.html

    Erst nachdem ich die Logik "fertig" habe, stelle ich fest, dass sie selbst auf einem Haswell (also kein raspi) Performance-Probleme hat -trotz einer mickrigen Funktion/Größe der XML Datei.

    Darüber hinaus musste ich die Daten ganz schön vor-verarbeiten (& raus, etc.) bevor sie geschluckt wurden.

    Ich habe erst danach ein wenig über xml-Bibliotheken in python gelesen und es wird oft dringlichst von minidom abgeraten.
    Aber wenn ich pylxml nutzen würde hätte ich eine zusätzliche Abhängigkeit. Daher erstmal hier die Diskussion...

    Was sagt ihr?

    Gruß,
    Hendrik

    #2
    Zitat von henfri Beitrag anzeigen
    Hallo,

    hier scheitere ich gerade ein wenig an minidom:
    https://knx-user-forum.de/smarthome-...interesse.html

    Erst nachdem ich die Logik "fertig" habe, stelle ich fest, dass sie selbst auf einem Haswell (also kein raspi) Performance-Probleme hat -trotz einer mickrigen Funktion/Größe der XML Datei.

    Darüber hinaus musste ich die Daten ganz schön vor-verarbeiten (& raus, etc.) bevor sie geschluckt wurden.

    Ich habe erst danach ein wenig über xml-Bibliotheken in python gelesen und es wird oft dringlichst von minidom abgeraten.
    Aber wenn ich pylxml nutzen würde hätte ich eine zusätzliche Abhängigkeit. Daher erstmal hier die Diskussion...

    Was sagt ihr?

    Gruß,
    Hendrik
    Kommt halt daruaf an, was du machen willst. Für simples Parsen und Erstellen von xml ist minidom vollkommen ausreichend. Natürlich ist z.B. lxml verführerisch, aber zumindestens bei meinem Sonos-Server bin ich wieder auf minidom umgestiegen (eben wegen der Abhängigkeit). Weder habe ich Performance-Probleme noch musste ich große Klimmzüge bei der Umsetzung machen.

    Was willst du denn umsetzen?
    Sonos

    Kommentar


      #3
      Hi Hendrik,

      das Thema kommt mir bekannt vor:
      https://knx-user-forum.de/334993-post16.html

      Bis bald

      Marcus

      P.S. ist immer noch meine Empfehlung.

      Kommentar


        #4
        Hallo,

        ich habe eine XML, in der die Elemente "Objekt_N" genannt sind:
        Code:
        <Objekte>
                <Objekt_0 x_l="800" y_o="121" x_r="42" y_u="150" Sondertype="0" Bezeichnung="FRIEDEL6.dat: T.Kollektor Wert" lockabel="0" locked="0" ausrichtung="0" Schriftfarbe="8421504" Hintergrund="16777215" invisble="0" Einheit="1" VorText="" Text="xxx" NachText="" Schriftart="0;-24;0;0;0;700;0;0;0;0;3;2;1;34;Calibri" Syntax="" Syntax2="" can_knoten="1" can_index="8333" can_subindex="1" changeable="0" Objekt_Typ="CAN_BL_Net_Obj"/>
                <Objekt_1 x_l="799" y_o="89" x_r="41" y_u="118" Sondertype="0" Bezeichnung="FRIEDEL6.dat: Solarstr. Wert" lockabel="0" locked="0" ausrichtung="0" Schriftfarbe="8421504" Hintergrund="16777215" invisble="0" Einheit="1" VorText="" Text="xxx" NachText="" Schriftart="0;-24;0;0;0;700;0;0;0;0;3;2;1;34;Calibri" Syntax="" Syntax2="" can_knoten="1" can_index="8333" can_subindex="16" changeable="0" Objekt_Typ="CAN_BL_Net_Obj"/>
                <Objekt_2 x_l="690" y_o="113" x_r="42" y_u="142" Sondertype="0" Bezeichnung="FRIEDEL6.dat: T.Aussen Wert" lockabel="0" locked="0" ausrichtung="0" Schriftfarbe="8421504" Hintergrund="16777215" invisble="0" Einheit="1" VorText="" Text="xxx" NachText="" Schriftart="0;-24;0;0;0;700;0;0;0;0;3;2;1;34;Calibri" Syntax="" Syntax2="" can_knoten="1" can_index="8333" can_subindex="12" changeable="0" Objekt_Typ="CAN_BL_Net_Obj"/>
        Diesen Objekten sind <div> Elemente zugeordnet, die in einer HTML zu finden sind:
        Code:
        <div id="pos0">&nbsp;17,7 &deg;C </div>
        Die XML lese ich so aus:
        Code:
        for i in range(0,len(objekte.childNodes)-2):
            nn=objekte.childNodes[i].nodeName
            if "Objekt_" in nn:
                id_conf.append(int(nn.replace('Objekt_','')))
                s=objekte.childNodes[i].getAttribute('Bezeichnung').split(': ')[1]
                beschreibung.append(s)
        Die HTML muss ich vorher säubern, da minidom den Kommentar nicht mag.
        Außerdem mag es die & nicht. Und ich muss Komma durch Punkt ersetzten.
        Code:
        html=html[html.index('<body'):]
        html=html.replace(',','.')
        html=html.replace('W/m&sup2;','')
        html=html.replace('&','')
        stripped=html[:-10]
        
        html=minidom.parseString(stripped)
        objekte=html.getElementsByTagName('div')
        Und das Parsen:
        Code:
        id_res=[]
        content=[]
        for i in range(0,len(objekte)):  
             try:
                id=objekte[i].getAttribute('id')
                val=objekte[i].firstChild.nodeValue
                id_res.append(int(id.replace('pos','')))
                content.append(clean(val))
             except:
                pass
        Später gehe ich durch die Liste der Beschreibungen ("beschreibung") und suche nach einem Match mit der zu suchenden Beschreibung (Eigenschaft des Items). Dann habe ich das N aus Objekt_N (an gleicher Stelle in id_conf).

        Dieses N nehme ich dann und suche in der Liste id_result (das sind die Nummern der div-Tags) nach dieser Zahl und merke mir den Index.
        Den Index nehme ich um den Wert aus "content" zu übernehmen:

        Code:
        #config: id_conf, beschreibung
        #result: id_res, content  
           curr_id_config=id_conf[beschreibung.index(str)]
           pos_in_result=id_res.index(curr_id_config)
           result=content[pos_in_result]
        Eigentlich ganz simpel.
        Aber der HTML-Lese-Teil gibt mir -wenn die Logik in sh.py läuft nur ein leeres "content" und braucht sehr lange -vermutlich bricht sh.py vorher die Ausführung ab (?).

        Ideen?
        Anbei die Dateien.

        Gruß,
        Hendrik
        Angehängte Dateien

        Kommentar


          #5
          Hm, kann keiner weiter helfen?

          Gruß,
          Hendrik

          Kommentar


            #6
            So wie ich das sehe, iterierst du über die einzelnen Nodes in einer Schleife. Versuche doch einfach mal mit XPATH die Nodes, bzw. Werte einzulesen. XPATH sollten auch die meisten xml-libs beherrschen.

            Grüsse,

            Stefan
            Sonos

            Kommentar


              #7
              Hallo,

              ich sollte besser lesen:
              Zitat von mknx Beitrag anzeigen
              das Thema kommt mir bekannt vor:
              https://knx-user-forum.de/334993-post16.html
              P.S. ist immer noch meine Empfehlung.
              Sorry, das habe ich überlesen (also diesmal; damals habe ich es gelesen, aber wohl nicht verinnerlicht :-( Gelobe Besserung.

              Zitat von pfischi Beitrag anzeigen
              So wie ich das sehe, iterierst du über die einzelnen Nodes in einer Schleife. Versuche doch einfach mal mit XPATH die Nodes, bzw. Werte einzulesen.
              Das habe ich beides umgesetzt. Es funktioniert. Mein Problem lag aber woanders (die clean-Routine hat 10000 mal iteriert. Das bremst..).

              Es läuft im sh.py -i Modus. Nicht aber als Logik mit 1:1 dem gleichen Code. Dafür mache ich einen eigenen Thread auf, da es um HTML-Parsen geht.

              Danke euch Beiden!

              Gruß,
              Hendrik

              Kommentar

              Lädt...
              X