Ankündigung

Einklappen
Keine Ankündigung bisher.

Welche XML-Bibliothek für Plugins?

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

  • henfri
    antwortet
    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

    Einen Kommentar schreiben:


  • pfischi
    antwortet
    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

    Einen Kommentar schreiben:


  • henfri
    antwortet
    Hm, kann keiner weiter helfen?

    Gruß,
    Hendrik

    Einen Kommentar schreiben:


  • henfri
    antwortet
    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

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    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.

    Einen Kommentar schreiben:


  • pfischi
    antwortet
    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?

    Einen Kommentar schreiben:


  • henfri
    hat ein Thema erstellt Welche XML-Bibliothek für Plugins?.

    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
Lädt...
X