LabVIEWForum.de
XML auswerten mit Regular Expressions oder doch Scan from String - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenbank & File IO (/Forum-Datenbank-File-IO)
+---- Thema: XML auswerten mit Regular Expressions oder doch Scan from String (/Thread-XML-auswerten-mit-Regular-Expressions-oder-doch-Scan-from-String)



XML auswerten mit Regular Expressions oder doch Scan from String - TpunktN - 02.04.2020 08:57

Servus Zusammen,

akuell habe ich ein wenig zeit und schaue ein älteres Projekt an. Ich bin einen anderen Weg gegangen und habe die Daten einzeln zerlegt, klappt erstmal ganz gut, anstatt 2,2 Sekunden lesen brauche ich noch 31 ms der aktuell 80 Parameter.. Ich stoße nur auf einige (hoffentlich) kleinere Probleme und suche hier um Hilfe.

Mein erster Versuch (mit Regular Expressions.vi) klappt ganz gut, der erste Teil war im nachhinein dann zu aufwendig programmiert und im 2ten Teil (mit Regular Expressions2.vi) gekürzt worden.
Den ersten versuch habe ich mal behalten, evtl geht das ohne 'Scan From String' direkt mit der 'Match Regular Expression', die finde ich aber recht kompliziert zu formulieren und habe es vertagt Tongue

Der Versuch es nur mit 'Scan From String' zu meistern ist kläglich gescheitert. Muss in 'Scan From String' alles (jedes Zeichen im String) definiert sein?

Als Platzhalter oder Markierung wird in der XML gelegentlich ein '???' verwendet, damit man da nochmal drüber schaut, das würde ich gerne abfangen. Wobei ich das wohl in eine separate Datei auslager, hat da drin nichts verloren und macht es nur Komplizierter..

Meine Fragen:
-Kann man Platzhalter in 'Scan From String' einbauen, ohne diese als Ausgang zu haben oder muss da wirklich jedes Zeichen in einem Block abgefragt werden?
-Gibt es eine Hilfe (zB Website, Tool) für Regular Expressions?
und das größte Problem
Es gibt bei manchen Parametern (und bei manchen Geraete) gelegentlich ein Liste (Array) das wird aber nur aufgeführt, wenn das Gerät/ der Parameter das auch benötigt. In der XML ist das sonst einfach leer.
Wie fragt man in 'Regular Expressions' oder/und 'Scan from String' ein Array ab?

MfG Timo


RE: XML auswerten mit Regular Expressions oder doch Scan from String - GerdW - 02.04.2020 09:07

Hallo Timo,

Zitat:Kann man Platzhalter in 'Scan From String' einbauen, ohne diese als Ausgang zu haben oder muss da wirklich jedes Zeichen in einem Block abgefragt werden?
ScanFromString erwartet einen exakten Formatstring, Platzhalter sind da schwierig.
Entweder benutzt du für einen String wie "123 Wort 4.567" also ein Format wie "%d %s %.;%f" - oder "123 Wort %.;%f" wenn du nur den Floatwert benötigst…

Zitat:Gibt es eine Hilfe (zB Website, Tool) für Regular Expressions?
Jede Menge, einfach mal mit deiner bevorzugten Suchmaschine suchen.
http://www.regex101.com
https://rubular.com/

Zitat:Es gibt bei manchen Parametern (und bei manchen Geraete) gelegentlich ein Liste (Array) das wird aber nur aufgeführt, wenn das Gerät/ der Parameter das auch benötigt. In der XML ist das sonst einfach leer. Wie fragt man in 'Regular Expressions' oder/und 'Scan from String' ein Array ab?
Indem man sich ein subVI baut, welches das komplette Array-Tag als Input bekommt und darin in einer Schleife alle Arrayelemente scannt und in ein Stringarray überführt.

Tipp:
Ich habe mir eine eigene Bibliothek geschrieben, die XML-ähnliche Dateien erzeugt (zum einfacheren Speichern/Verwalten von Parametern). Da habe ich eine Funktion, die nach einem Tag in der Art von <TAG>WERT</TAG> sucht und mir den WERT zurückgibt. Dank Polymorphie und Angabe eines erwarteten Datentyps bekomme ich den WERT auch im erwarteten Datentyp zurück. So sieht die Kernfunktion aus:
[attachment=60819]

Dieser WERT kann wiederum andere Tags enthalten, wie in deinem Beispiel:
Code:
<Geraet>
   <Geraetecode>%[^<]</Geraetecode>
   <Geraetename>%[^<]</Geraetename>
   <Geraeteparameter>%[^G]Geraeteparameter>
   <ServiceModus>%[^<]</ServiceModus>
</Geraet>
Ich rufe diese Funktion also mit "Geraet" auf, mit dem gelieferten Wert dann noch mal mit Geraetecode, Geraetename und ServiceModus…


RE: XML auswerten mit Regular Expressions oder doch Scan from String - TpunktN - 02.04.2020 12:12

Danke Gerd,

Zitat:ScanFromString erwartet einen exakten Formatstring, Platzhalter sind da schwierig.
So war auch meine Erfahrung gestern/heute Sad

Zitat:Jede Menge, einfach mal mit deiner bevorzugten Suchmaschine suchen.
Schau ich mir mal an, danke.
Ich habe mir die offiziell verlinkte Website mal angeschaut, ist das ein eigenes Studienfach? Das ist eine gigantische Anleitung ..

Zitat:Indem man sich ein subVI baut, welches das komplette Array-Tag als Input bekommt und darin in einer Schleife alle Arrayelemente scannt und in ein Stringarray überführt.
An so etwas bin ich gerade dran, 'Match Pattern' funktioniert ganz gut, muss es nur noch in mein Cluster verarbeiten. Lässt sich ganz gut in For-Schleifen abarbeiten. Habe die vorabversion mal angehängt.

Danke für die Tipps.
Die integrierten XML vi's zu nehmen war echt keine gute Idee, wieso gibts die überhaupt? Dann doch lieber gar nicht, oder?

MfG Timo


RE: XML auswerten mit Regular Expressions oder doch Scan from String - GerdW - 02.04.2020 12:27

Hallo Timo,

Zitat:Ich habe mir die offiziell verlinkte Website mal angeschaut, ist das ein eigenes Studienfach? Das ist eine gigantische Anleitung ..
Ich kenne mit mit RegEx nicht gut aus und bin auch jedesmal wieder erschlagen von der Komplexität…

Zitat:Habe die vorabversion mal angehängt.
Da könntest du aber noch viel verbessern:
- Wenn du in den Stringarray-Konstanten nicht so viele leere Strings drin hättest, bräuchtest du in den Auswerte-FOR-Loops nicht extra auf "leerer String" testen…
- Mehr subVIs, insbesondere für diese XML-Parse-Funktionen, statt copy&paste…

Zitat:Die integrierten XML vi's zu nehmen war echt keine gute Idee, wieso gibts die überhaupt? Dann doch lieber gar nicht, oder?
Mit denen habe ich noch nicht gearbeitet, sie werden aber für NI-eigene Sachen prima funktionieren! (Beispiel: mit LabVIEW Daten nach XML und später wieder zurück in LabVIEW-Datentypen konvertieren…)


RE: XML auswerten mit Regular Expressions oder doch Scan from String - TpunktN - 02.04.2020 16:01

Servus Gerd,

danke für die Kritik, ich war ja auch mitten drin, zumindest mache ich das immer im BD und erstelle nach erfolgreichem Funktionstest dann ein SubVI. Wink
Anbei habe ich es jetzt geschafft alles Auszulesen, die SubVI-Icons mach ich morgen schön, die Zeit rennt, wenn man so am durchtesten ist Big Grin

diese RegEx kann man aufziehen, hat das irgendeine Funktion? Da waren bei mir nie Ergebnisse drin und in der Hilfe finde ich auch nichts dazu ..

Vielleicht schaffe ich das Morgen die XML auch wieder zu schreiben, irgendwelche Warnungen oder Tipps vorweg? Smile

MfG Timo