XML auslesen und Daten in Variable schreiben

  • 16 Antworten
  • Letztes Antwortdatum
rtwl

rtwl

Dauer-User
1.519
Gibt es eigentlich eine Möglichkeit eine lokale XML Datei auszulesen und deren Werte als Variablen zu schreiben?

XML:
....
<actuators>
<actuator>
<name>Wohnzimmer</name>
<type>trust</type>
<steps>17</steps>
<commandlist>
<command>
<name>on</name>
<param>cmd=on,typ,it,did,90974500,aid,23,acmd,1,seq,6&id=23</param>
</command>
<command>
<name>toggle</name>
<param>cmd=toggle,typ,it,did,90974500,aid,23,acmd,2,seq,6&id=23</param>
</command>
<command>
<name>off</name>
<param>cmd=off,typ,it,did,90974500,aid,23,acmd,0,seq,6&id=23</param>
</command>
....

ich hätte gerne pro <actuator> mehrere Arrays die Folgendermaßen aufgebaut sind "Actuator-Name, Command-Name, Param"

Also wäre laut Beispiel so:
%Aktor1(): Wohnzimmer, on, cmd=on...
%Aktor2(): Wohnzimmer, toggle, cmd=toggle...
%Aktor3(): Wohnzimmer, off, cmd=off...

Das ganze würde dann vermutlich bis %Aktor100() gehen, oder sogar mehr.

<type> und <steps> gibt es bei allen Aktoren benötige ich aber nicht.


wäre für Hilfe sehr dankbar!
 
Es gibt mit dem Plugin AutoTools die Möglichkeit mit der Aktion "Jason Read" XML-Dateien auszulesen. Konnte es aber nicht testen da ich dazu die komplette XML-Datei benötige.

Falls das nicht funktioniert, kannst du auch mit der Aktion "Datei lesen" die XML-Datei in einer Variable speichern. Danach mit Variable aufteilen und/oder Variable Suchen ersetzen die einzelnen Werte auszulesen.

Danach mit For-Schleifen die einzelnen Variablen zu den gewünschten Arrays zusammensetzen.

Wenn du mir die XML-Datei gibst, kann ich dir auch den Task erstellen
 
  • Danke
Reaktionen: ilkaskim, rtwl, Spardas und eine weitere Person
@Mathens
Vielen dank für das Angebot! Ich hab dir die XML als PN zur Verfügung gestellt. Auch wenn ich in der Theorie deine Vorschläge verstehe, ist mir das insgesamt zu hoch und würde da ewig herum werken, um dann schließlich aufgeben.

Den fertigen Task kannst du gerne hier posten, ist ja vielleicht auch für andere interessant.
 
Das Auslesen mit AutoTools funktioniert. Habe es aber nicht verwendet, da es mit der zweiten Variante weniger kompliziert ist.

Task importieren
Code:
    XML auslesen (45)
        A1: Array Leeren [ Variable Array:%Szene ]
        A2: Array Leeren [ Variable Array:%Aktor ]
        A3: Datei lesen [ Datei:Tasker/Notes/config.xml zu Variable:%datei ]
        A4: Variable Aufteilen [ Name:%datei Teiler:</lightscenes> Basis löschen:Aus ]
        A5: Variable Suchen Ersetzen [ Variable:%datei1 Suche:(?<=<name>).+(?=<\/name>) Ignore Case:Aus Multi-Line:Aus One Match Only:Aus Übereinstimmung Speichern In:%name Übereinstimmungen Ersetzen:Aus Ersetzen Durch: ]
        A6: Variable Suchen Ersetzen [ Variable:%datei1 Suche:(?<=<param>).+(?=<\/param>) Ignore Case:Aus Multi-Line:Aus One Match Only:Aus Übereinstimmung Speichern In:%param Übereinstimmungen Ersetzen:Aus Ersetzen Durch: ]
        A7: For [ Variable:%zähler Einträge:1:%name(#) ]
        A8: Variable Umrechnen [ Name:%name(%zähler) Funktion:HTML zu Text Ergebnis Ablegen In: Modus:Default ]
        A9: Array Set [ Variable Array:%Szene(%zähler) Values:%name(%zähler)
    %param(%zähler) Teiler:
     ]
        A10: End For
        A11: Variable Lösche [ Name:%zähler Mustervergleich:Aus Local Variables Only:Aus Clear All Variables:Aus ]
        A12: Array Leeren [ Variable Array:%name ]
        A13: Array Leeren [ Variable Array:%param ]
        A14: Variable Aufteilen [ Name:%datei Teiler:<actuator> Basis löschen:Aus ]
        A15: For [ Variable:%data Einträge:%datei(2:) ]
        A16: Variable Suchen Ersetzen [ Variable:%data Suche:(?<=<name>).+(?=<\/name>) Ignore Case:Aus Multi-Line:Aus One Match Only:An Übereinstimmung Speichern In:%name Übereinstimmungen Ersetzen:Aus Ersetzen Durch: ]
        <ASCII Code umwandeln>
        A17: Variable Umrechnen [ Name:%name1 Funktion:HTML zu Text Ergebnis Ablegen In: Modus:Default ]
        A18: Variable Aufteilen [ Name:%data Teiler:<command> Basis löschen:Aus ]
        A19: For [ Variable:%command Einträge:%data(2:) ]
        A20: Variable Suchen Ersetzen [ Variable:%command Suche:(?<=<name>).+(?=<\/name>) Ignore Case:Aus Multi-Line:Aus One Match Only:Aus Übereinstimmung Speichern In:%command Übereinstimmungen Ersetzen:Aus Ersetzen Durch: ]
        A21: Variable Suchen Ersetzen [ Variable:%command Suche:(?<=<param>).+(?=<\/param>) Ignore Case:Aus Multi-Line:Aus One Match Only:An Übereinstimmung Speichern In:%param Übereinstimmungen Ersetzen:Aus Ersetzen Durch: ]
        A22: Variable Addiere [ Name:%zähler Wert:1 Obergrenze:0 ]
        A23: Array Set [ Variable Array:%Aktor(%zähler) Values:%name1
    %command1
    %param1 Teiler:
     ]
        A24: End For
        A25: End For
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: qwoka und rtwl
funktioniert perfekt, wie alle deine tasks die du teilst!
Danke für deine Zeit!
 
  • Danke
Reaktionen: Mathens
Ich möchte jetzt gerne diese arrays durchsuchen und den Wert auslesen.
die Suche klappt um die Position zu bekommen, aber dann den Wert auslesen geht nicht.

1: %Szene(%AAsuche)
2: %Szene(81)
3: %AAsuche

1. Sollte "Esstisch" ausgeben - funktioniert aber nicht. Hier kommt "%Szene0".
2. gibt korrekt "Esstisch" aus.
3. gibt korrekt "81" aus.

Warum funktioniert %Szene(%AAsuche) nicht?

Screenshot_20201204-220839~2.png
Screenshot_20201204-221019.png
 
Habe den Task nachgebaut und bei mir funktioniert er so wie er soll.
Hier mein Task zum testen
 
Danke, leider komm ich damit zum selben Ergebnis 🤔

bei 1. kommt wieder "%Szene0"
wenn ich allerdings eine Aktion "Variable Setzen" mathematisch AN und %AAsuche mit 1 multipliziere, funktioniert es.
Aber auch nur wenn das Ergebnis der Suche nur einen Treffer hat. Was ja auch logisch ist.


hab jetzt aber mal deinen ursprünglichen task kopiert und etwas adaptiert und fünf Arrays erstellt (pro Name/Befehl/Parameter ein Array) Damit sollte es einfacher funktionieren.
morgen teste ich dann weiter.
 
Was hast du genau mit den Arrays vor?
Es gibt auch die Möglichkeit nur die gesuchten Daten aus der XML auszulesen.
Zum Beispiel zuerst alle Namen auslesen, dann mit List Dialog eine Liste mit diesen anzeigen lassen (List Dialog hat auch eine Suchfunktion integriert) und vom ausgewählten Wert dann alle Befehle und Parameter auslesen.
 
Als erstes möchte ich mal die Parameter der Szenen bzw Aktoren auslesen für die Zwischenablage. Damit ich mit diesen einen HTTP Befehl vervollständigen kann.
bei den Szenen ist es relativ einfach mit dem List Dialog, da es hier nur Name und Parameter gibt. Bei den Aktoren gibt's eben Name und Command um zum Parameter zu kommen.

später vielleicht mal (sofern ich eine gute Lösung finde) via variable den Befehl zusammensetzen lassen. Aber das dann eher für Aktoren und d ist eben das Name/Command Thema wo ich noch hänge. (aber ich teste eh gerne selber
das ganze wird in einer tasker Szene (smarthome Steuerung) passieren um bei einer Änderung /Ergänzung der vorhandenen Aktoren einfacher das Dashboard zu aktualisieren.

und zu guter letzt eventuell das Projekt so aufbereiten, dass es für unerfahrene tasker User auch möglich ist sich ihr Dashboard für die selbe smarthome Zentrale (Lightmanager von Jbmedia) aufzubauen. Aber ob das möglich ist bzw ich dem Weg weiter verfolge, kann ich noch nicht sagen.
 
Habe noch ein wenig mit dem Auslesen der XML-Datei mit AutoTools rumprobiert.
Wie du geschrieben hast geht das Auslesen der einzeln Szenen recht einfach.
Bei den Aktoren war es schon schwieriger. Dort habe ich zwei Varianten, mit Auswahl der Zone oder alle Aktoren auf einmal.

Projekt importieren
Code:
    Parameter auslesen Szene (159)
        A1: AutoTools Json Read [ Konfiguration:Input Format: XML
    Json: /storage/emulated/0/Tasker/Notes/config.xml
    Fields: lightman.lightscenes.scene.name(),lightman.lightscenes.scene.param()
    Variable Name: liste(),parameter()
    Separator: , Timeout (Sekunden):3569 ]
        A2: Variable Setzen [ Name:%liste Zu:%liste() Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ]
        A3: Variable Umrechnen [ Name:%liste Funktion:HTML zu Text Ergebnis Ablegen In: Modus:Default ]
        A4: List Dialog [  Modus:Select Single Item Titel:Szene auswählen Einträge:%liste Selected Items: Long Click Task: Button 1: Button 2: Button 3: Close After (Seconds):30 Use HTML:Aus First Visible Index:0 Hide Filter:Aus ]
        A5: Variable Setzen [ Name:%Parameter Zu:%parameter(%ld_selected_index) Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ]
        A6: Popup-Benachrichtigung [ Text:Parameter kopiert
    %Parameter Lang:An ]
        A7: Zwischenablage setzen [ Text:%Parameter Hinzufügen:Aus ]
Code:
    Parameter auslesen Befehl mit Zonen (172)
        A1: AutoTools Json Read [ Konfiguration:Input Format: XML
    Json: /storage/emulated/0/Tasker/Notes/config.xml
    Fields: lightman.zone.zonename()
    Variable Name: liste()
    Separator: , Timeout (Sekunden):3569 ]
        A2: Variable Setzen [ Name:%liste Zu:%liste() Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ]
        A3: Variable Umrechnen [ Name:%liste Funktion:HTML zu Text Ergebnis Ablegen In: Modus:Default ]
        A4: List Dialog [  Modus:Select Single Item Titel:Zone auswählen Einträge:%liste Selected Items: Long Click Task: Button 1: Button 2: Button 3: Close After (Seconds):30 Use HTML:Aus First Visible Index:0 Hide Filter:Aus ]
        A5: Variable Setzen [ Name:%zone Zu:%ld_selected_index-1 Recurse Variables:Aus Mathematisch:An Hinzufügen:Aus Max Rounding Digits:3 ]
        A6: Array Leeren [ Variable Array:%liste ]
        A7: AutoTools Json Read [ Konfiguration:Input Format: XML
    Json: /storage/emulated/0/Tasker/Notes/config.xml
    Fields: lightman.zone[%zone].actuators.actuator.name()
    Variable Name: liste()
    Separator: , Timeout (Sekunden):3569 ]
        A8: Variable Setzen [ Name:%liste Zu:%liste() Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ]
        A9: Variable Umrechnen [ Name:%liste Funktion:HTML zu Text Ergebnis Ablegen In: Modus:Default ]
        A10: List Dialog [  Modus:Select Single Item Titel:Aktor auswählen Einträge:%liste Selected Items: Long Click Task: Button 1: Button 2: Button 3: Close After (Seconds):30 Use HTML:Aus First Visible Index:0 Hide Filter:Aus ]
        A11: Variable Setzen [ Name:%actuator Zu:%ld_selected_index-1 Recurse Variables:Aus Mathematisch:An Hinzufügen:Aus Max Rounding Digits:3 ]
        A12: If [ %liste(#) < 2 ]
        A13: Array Leeren [ Variable Array:%liste ]
        A14: AutoTools Json Read [ Konfiguration:Input Format: XML
    Json: /storage/emulated/0/Tasker/Notes/config.xml
    Fields: lightman.zone[%zone].actuators.actuator.commandlist.command.name,lightman.zone[%zone].actuators.actuator.commandlist.command.param
    Variable Name: liste(),parameter()
    Separator: , Timeout (Sekunden):3569 ]
        A15: Else
        A16: Array Leeren [ Variable Array:%liste ]
        A17: AutoTools Json Read [ Konfiguration:Input Format: XML
    Json: /storage/emulated/0/Tasker/Notes/config.xml
    Fields: lightman.zone[%zone].actuators.actuator[%actuator].commandlist.command.name,lightman.zone[%zone].actuators.actuator[%actuator].commandlist.command.param
    Variable Name: liste(),parameter()
    Separator: , Timeout (Sekunden):3569 ]
        A18: End If
        A19: Variable Setzen [ Name:%liste Zu:%liste() Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ]
        A20: Variable Umrechnen [ Name:%liste Funktion:HTML zu Text Ergebnis Ablegen In: Modus:Default ]
        A21: List Dialog [  Modus:Select Single Item Titel:Befehl auswählen Einträge:%liste Selected Items: Long Click Task: Button 1: Button 2: Button 3: Close After (Seconds):30 Use HTML:Aus First Visible Index:0 Hide Filter:Aus ]
        A22: Variable Setzen [ Name:%Parameter Zu:%parameter(%ld_selected_index) Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ]
        A23: Popup-Benachrichtigung [ Text:Parameter kopiert
    %Parameter Lang:An ]
        A24: Zwischenablage setzen [ Text:%Parameter Hinzufügen:Aus ]
Code:
    Parameter auslesen Befehl ohne Zone (45)
        A1: Datei lesen [ Datei:Tasker/Notes/config.xml zu Variable:%xml ]
        A2: Variable Suchen Ersetzen [ Variable:%xml Suche:<.?zone>|<zonen.+>|<.?actuators> Ignore Case:Aus Multi-Line:Aus One Match Only:Aus Übereinstimmung Speichern In: Übereinstimmungen Ersetzen:An Ersetzen Durch: ]
        A3: AutoTools Json Read [ Konfiguration:Input Format: XML
    Json: %xml
    Fields: lightman.actuator.name()
    Variable Name: liste()
    Separator: , Timeout (Sekunden):470 ]
        A4: Variable Setzen [ Name:%liste Zu:%liste() Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ]
        A5: Variable Umrechnen [ Name:%liste Funktion:HTML zu Text Ergebnis Ablegen In: Modus:Default ]
        A6: List Dialog [  Modus:Select Single Item Titel:Aktor auswählen Einträge:%liste Selected Items: Long Click Task: Button 1: Button 2: Button 3: Close After (Seconds):30 Use HTML:Aus First Visible Index:0 Hide Filter:Aus ]
        A7: Variable Setzen [ Name:%actuator Zu:%ld_selected_index-1 Recurse Variables:Aus Mathematisch:An Hinzufügen:Aus Max Rounding Digits:3 ]
        A8: Array Leeren [ Variable Array:%liste ]
        A9: AutoTools Json Read [ Konfiguration:Input Format: XML
    Json: %xml
    Fields: lightman.actuator[%actuator].commandlist.command.name,lightman.actuator[%actuator].commandlist.command.param
    Variable Name: liste(),parameter()
    Separator: , Timeout (Sekunden):3569 ]
        A10: Variable Setzen [ Name:%liste Zu:%liste() Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ]
        A11: Variable Umrechnen [ Name:%liste Funktion:HTML zu Text Ergebnis Ablegen In: Modus:Default ]
        A12: List Dialog [  Modus:Select Single Item Titel:Befehl auswählen Einträge:%liste Selected Items: Long Click Task: Button 1: Button 2: Button 3: Close After (Seconds):30 Use HTML:Aus First Visible Index:0 Hide Filter:Aus ]
        A13: Variable Setzen [ Name:%Parameter Zu:%parameter(%ld_selected_index) Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ]
        A14: Popup-Benachrichtigung [ Text:Parameter kopiert
    %Parameter Lang:An ]
        A15: Zwischenablage setzen [ Text:%Parameter Hinzufügen:Aus ]
 
Zuletzt bearbeitet:
komisch. Ich bekomme bei allen drei tasks eine Fehlermeldung.
hier die Meldung(en) vom "Parameter auslesen Szene" task. ich versteh es aber nicht.
vielleicht liegt es aber an was anderem. Hatte ja auch ein anderes Problem welches bei dir funktioniert (Post #6). 🤔

Screenshot_20201209-210150.png

Screenshot_20201209-210140.png
 
Der Fehler liegt irgendwo beim Name Jalousie ▲ und auch bei Jalousie ▼
Dort hat AutoTools ein Problem mit dem Unicodes.
Hast du die XML-Datei zuvor schon irgendwie geändert? Zum Beispiel die Unicodes in Symbole konvertiert?
Bei mir sieht der Abschnitt in der XML so aus
Code:
<name>Jalousie&#32;&#38;&#35;9650</name>
Nach dem Konvertieren sieht der Abschnitt so aus
Code:
<name>Jalousie &#9650</name>
&#32; ist ein Leerzeichen
&#38; ist ein &-Zeichen
&#35; ist ein #-Zeichen
Und dann fehlt der Strichpunkt nach dem Unicode, welches dir AutoTool so als Fehler ausgibt.
 
Zuletzt bearbeitet:
Habe die Tasks angepasst, damit sie die Fehlerhafte Stelle korrigieren und in Tasker korrekt angezeigt werden.

Projekt importieren
 
Zuletzt bearbeitet:
Danke für deine Mühe.
als nochmal der Fehler kam, fiel mir ein zahlendreher in A3 auf. Da hast du vermutlich einmal die 9650 nicht zur 9660 ausgebessert.
aber auch nach dem korrigieren kommt ein Fehler.
Code:
13.23.23/E org.a.b: Missing in XML entity: &id at 4490 [character 57 line 491]
ich denke das kommt vom "Fernseher Strom Shelly" da dort eine URL im command versteckt ist und diese auch das Symbol '&' enthält.

aber auch komisch warum es bei dir läuft und bei mir nicht?
 
Kann es sein, dass beim Herunterladen mit Tasker, die XML-Datei verändert wird?
Kannst du bitte den Task noch mit der XML-Datei testen, welche ohne Tasker heruntergeladen worden ist.
 
Ich hab eigentlich immer die XML verwendet die ich anfangs heruntergeladen hatte und dann mit dir geteilt.
daher hab ich jetzt genau das Gegenteil gemacht und mit der Aktion 'HTTP get' die XML heruntergeladen und bei deinen tasks als A1 eingefügt.
So hat es dann sofort funktioniert!

Vielen Dank. Das ist genau das was ich haben wollte! Danke @Mathens!
 
  • Danke
Reaktionen: Mathens

Ähnliche Themen

T
Antworten
6
Aufrufe
317
Tarfi
T
0
Antworten
4
Aufrufe
245
0karsten
0
marspoki
Antworten
3
Aufrufe
602
Mathens
Mathens
Zurück
Oben Unten