LabVIEWForum.de
PropertyNode Referenz zu Allen Array Elementen (XML schreiben) - 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: PropertyNode Referenz zu Allen Array Elementen (XML schreiben) (/Thread-PropertyNode-Referenz-zu-Allen-Array-Elementen-XML-schreiben)



PropertyNode Referenz zu Allen Array Elementen (XML schreiben) - TpunktN - 06.05.2020 12:16

Servus Zusammen,

nachdem ich es jetzt geschafft habe meine XML zu lesen https://www.labviewforum.de/Thread-XML-auswerten-mit-Regular-Expressions-oder-doch-Scan-from-String, möchte ich diese gerne speichern.
An sich nicht schwer, Parameter nehmen, einklammern, schreiben fertig.

Aber einfach kann ja jeder und ich will auch was lernen, also die Tags aus den Label.Text erstellen. Jens hat mir mal was tolles gezeigt (über PropertyNodes https://www.labviewforum.de/Thread-Wann-schliesse-ich-ActiveX-Excel-Referenzen-wie-Cluster-to-Array?pid=195985#pid195985) Ich hatte damit mal rumgespielt https://www.labviewforum.de/Thread-Wann-schliesse-ich-ActiveX-Excel-Referenzen-wie-Cluster-to-Array?pid=195992#pid195992 um universell in Excel zu schreiben. Mit den PropertyNodes habe ich es dann aber aufgegeben, ich wollte zu viel für mein Wissensstand..
Jetzt mit kleinerem nicht ganz so universellem Umfang klappt es an sich ganz gut, nur ein Schritt fehlt mir und ich habe keine Ahnung wie ich das machen kann.

Im angehängten Bild will ich jetzt alle Elemente aus diesem Array die Referenzen haben und in einer For-Loop weiterarbeiten. Wenn ich die property Value mit Variant to Data mache bekomme ich zwar den Inhalt, davon bekomme ich aber keine Referenz mehr (zumindest finde ich es nicht), so wie es angehängt ist, bekomme ich den Wert (ein Cluster) des ersten Elements. (in dem Cluster sind alles Integer)
Somit meine Fragen:
1. Bekomme ich aus dem Array auch ein Array mit allen Element-Referenzen?
--a. oder muss ich den Index manuell an der PropertyNode selbst hochzählen, für jedes Element?
2. Kann man PropertyNodes auch an eine beliebige Verbindung anschließen? (Nach dem Variant to Data)

Schöner wäre eine While Loop, die beim Tiefer gehen das Label.Text ließt und in Klammern mit dem Wert formatiert, am Ende dann wieder hoch springt, aber da habe ich nichts zu in der Hilfe gefunden und meine Kenntnis in LabVIEW ist da nicht tief genug Sad Oder ich seh den Wald vor lauter Bäumen nicht.

Danke, Timo


RE: PropertyNode Referenz zu Allen Array Elementen (XML schreiben) - jg - 06.05.2020 12:48

Nein, das wird über diesen Weg nicht funktionieren. Die Array-Element Referenz geht immer nur auf 1 Element des Arrays (wenn ich es richtig im Kopf habe, auf das zuletzt angeklickte, aber nagel mich nicht darauf fest).

Du könntest damit natürlich das Label und den Control-Typ des Array-Elements ermitteln, aber nicht die Werte von allen Array Elementen.

Wenn du etwas lernen willst, schau dir an, wie die GXML-Library einen XML-File aus einem Variant erstellt.

Wenn du unbedingt mit deinem Ansatz weiter machen willst, dann würde ich den "Variant-Value" des Gesamt-Array nehmen und dann mit Hilfe der Datentyp-Info aus dem Array-Element per Variant to Data auf den richtigen Datentyp umwandeln. Danach kannst du die Werte korrekt parsen.

Und zur besseren Erklärung noch ein Bild:

[attachment=60922]

Gruß, Jens


RE: PropertyNode Referenz zu Allen Array Elementen (XML schreiben) - TpunktN - 06.05.2020 14:10

(06.05.2020 12:48 )jg schrieb:  Nein, das wird über diesen Weg nicht funktionieren. Die Array-Element Referenz geht immer nur auf 1 Element des Arrays (wenn ich es richtig im Kopf habe, auf das zuletzt angeklickte, aber nagel mich nicht darauf fest).
Was ich bis jetzt gelesen habe ist es wohl genau so, oder ein zufälliges in dem aktuellen sichtbaren Bereich (wenn mehrerer angezeigt werden und ncihts angeklickt wurde).

Zitat:Du könntest damit natürlich das Label und den Control-Typ des Array-Elements ermitteln, aber nicht die Werte von allen Array Elementen.

Wenn du etwas lernen willst, schau dir an, wie die GXML-Library einen XML-File aus einem Variant erstellt.

Wenn du unbedingt mit deinem Ansatz weiter machen willst, dann würde ich den "Variant-Value" des Gesamt-Array nehmen und dann mit Hilfe der Datentyp-Info aus dem Array-Element per Variant to Data auf den richtigen Datentyp umwandeln. Danach kannst du die Werte korrekt parsen.

Habs mir bei EasyXML angeschaut, habs nicht kapiert :/
Anbei ein Lösungsansatz, aus https://forums.ni.com/t5/LabVIEW/Accessing-Array-elements-via-Property-Nodes/td-p/3272325?profile.language=en abgeleitet, dabei wird das zuletzt angeklickte gesetzt. Es funktioniert, wobei das vermutlich kritisch ist und eher eine Frage der Zeit bis es versagt.
Ich mache das einfach mit dem mir bekannten Array, wandel das mit Variant To Data,und arbeite in einer For Loop mit Unbundle By Name weiter.

Was die Frage offen lässt, kann ich auf die Property Node von einem so erstellten Cluster zugreifen? Also das Array indexieren und dem vereinzelten Cluster die Properties anschauen?

Grüße Timo

Beide Konverter (GXML und EasyXML) geben merkwürdige Zeichen aus, habe ich schon getestet :/


RE: PropertyNode Referenz zu Allen Array Elementen (XML schreiben) - jg - 06.05.2020 16:40

(06.05.2020 14:10 )TpunktN schrieb:  Was die Frage offen lässt, kann ich auf die Property Node von einem so erstellten Cluster zugreifen? Also das Array indexieren und dem vereinzelten Cluster die Properties anschauen?
Keine Ahnung, was du jetzt vor hast...

(06.05.2020 14:10 )TpunktN schrieb:  Beide Konverter (GXML und EasyXML) geben merkwürdige Zeichen aus, habe ich schon getestet :/
GXML funktioniert aus meiner Erfahrung super - wenn man die Fehler kennt, die dort im Sourcecode stecken, z.B.: Zahlen werden leider mit lokalem Dezimaltrennzeichen erzeugt, bei einem Datum auf das lokale Datumsformat zurückgegegriffen - nicht gerade XML-Standard.
Deshalb hab ich für meine Firma eine angepasste Version erstellt.

Gruß, Jens


RE: PropertyNode Referenz zu Allen Array Elementen (XML schreiben) - TpunktN - 07.05.2020 06:58

(06.05.2020 16:40 )jg schrieb:  Keine Ahnung, was du jetzt vor hast...
Also die Idee war: Wenn ich ein Array of Cluster an eine For Schleife anschließe habe ich jede interation nur ein Cluster, dessen Properties ich ja wieder abfragen kann..
Aber soweit ich mich jetzt eingelesen habe, verweißt eine Property Node immer auf ein Object, somit müsste ich das in ein Control/Indicator schreiben um damit weiter propertieren zu können Big Grin
(06.05.2020 16:40 )jg schrieb:  GXML funktioniert aus meiner Erfahrung super - wenn man die Fehler kennt, die dort im Sourcecode stecken, z.B.: Zahlen werden leider mit lokalem Dezimaltrennzeichen erzeugt, bei einem Datum auf das lokale Datumsformat zurückgegegriffen - nicht gerade XML-Standard.

Dann versuch ich es nochmal, weißt du gerade zufällig wo das mit den Dezimaltrennzeichen steckt, das müsste ich auch anpassen.

EasyXML sieht so aus, keine Ahnung warum das die Klammern verbugt:
Code:
<AlleParameter>
    <Sendecode>s</Sendecode>



RE: PropertyNode Referenz zu Allen Array Elementen (XML schreiben) - Freddy - 07.05.2020 08:28

Hallo Timo,

XML mit dem JKI Tool EasyXML Tool erleichtert die die Aufgabe.

Du schreibst Deine Daten in ein Cluster erzeugst am Ende das XML wie in meinem Beispiel.

Rune = erzeugter XML
Daten = XML in LabView Daten

Gruß
Freddy


RE: PropertyNode Referenz zu Allen Array Elementen (XML schreiben) - TpunktN - 07.05.2020 08:40

Habe mal aus beidem einfach mal nen String erstellen lassen.
GXML Schreibt den Typ und Array größe dazu, ist glaube ich im XML Format erlaubt, will ich aber nicht. Werde mich damit mal beschäftigen, ob es eine Config dafür gibt oder ob ich das rausschmeiße im Code. (Wie hast du das gemacht mit Änderungen? Speichert man dann ein eigenes Addon? Sonst wird das beim Update überschrieben, oder?)
Code:
<Parameter mems='14'>
        <LaufendeNummer type='I32'>1</LaufendeNummer>
        <Sendecode type='String'>s</Sendecode>
        <KanalnummerSensor type='String'></KanalnummerSensor>
        <Bezeichnung mems='2'>
          <Deutsch type='String'>Version</Deutsch>
          <Englisch type='String'>Version</Englisch>
        </Bezeichnung>
        <Sendelaenge type='I32'>0</Sendelaenge>
        <Empfangslaenge type='I32'>5</Empfangslaenge>
        <Typ type='Enum U16' sel='Text'>0</Typ>
        <Auswahl dim='[1]' type='String'>
          <Aw>none</Aw>
        </Auswahl>
        <Dezimal type='I32'>2</Dezimal>
        <Dezimalzeichen type='String'>.</Dezimalzeichen>
        <ParamListe dim='[1]' type='I32'>
          <P>-1</P>
        </ParamListe>
        <Kompatibel mems='2'>
          <min type='DBL'>0</min>
          <max type='DBL'>0</max>
        </Kompatibel>
        <Geraetekennung dim='[1]' type='String'>
          <A>SET</A>
        </Geraetekennung>
        <Systeminfo mems='5'>
          <Standardwert type='String'>0</Standardwert>
          <Aenderbar type='I32'>0</Aenderbar>
          <Service type='I32'>1</Service>
          <dBefehlabschluss type='I32'>13</dBefehlabschluss>
          <Info type='String'>Geraet und Version lesen.</Info>
        </Systeminfo>
      </Parameter>

EasyXML ließt nicht die Array-Element-Labels und macht mir damit das Schema kaputt. Wenn ich aber so darüber nachdenke, sind diese Subkategorien aber auch überflüssig ...
Code:
<HoentzschParameter>
    <LaufendeNummer>1</LaufendeNummer>
    <Sendecode>s</Sendecode>
    <KanalnummerSensor/>
    <Bezeichnung>
      <Deutsch>Version</Deutsch>
      <Englisch>Version</Englisch>
    </Bezeichnung>
    <Sendelaenge>0</Sendelaenge>
    <Empfangslaenge>5</Empfangslaenge>
    <Typ>Text</Typ>
    <Auswahl>none</Auswahl>
    <Dezimal>2</Dezimal>
    <Dezimalzeichen>.</Dezimalzeichen>
    <ParamListe>-1</ParamListe>
    <Kompatibel>
      <min>0</min>
      <max>0</max>
    </Kompatibel>
    <Geraetekennung>SET</Geraetekennung>
    <Systeminfo>
      <Standardwert>0</Standardwert>
      <Aenderbar>0</Aenderbar>
      <Service>1</Service>
      <dBefehlabschluss>13</dBefehlabschluss>
      <Info>Geraet und Version lesen.</Info>
    </Systeminfo>
  </HoentzschParameter>
Muss ich mit meinen Kollegen absprechen, die greifen auch auf diese XML zu. Die freuen sich sicherlich riesig wenn es Änderungen gibt Big Grin


RE: PropertyNode Referenz zu Allen Array Elementen (XML schreiben) - jg - 07.05.2020 13:31

(07.05.2020 06:58 )TpunktN schrieb:  Dann versuch ich es nochmal, weißt du gerade zufällig wo das mit den Dezimaltrennzeichen steckt, das müsste ich auch anpassen.
Klick dich durch die VIs im Generator und Parser VI von GXML.

Bei der Erstellung hängt das im "Unflatten und Scan Item.vi".

Beim Parsen im "XML to Flat String.vi".

Gruß, Jens


RE: PropertyNode Referenz zu Allen Array Elementen (XML schreiben) - jg - 07.05.2020 13:54

(07.05.2020 08:40 )TpunktN schrieb:  Habe mal aus beidem einfach mal nen String erstellen lassen.
GXML Schreibt den Typ und Array größe dazu, ist glaube ich im XML Format erlaubt, will ich aber nicht. Werde mich damit mal beschäftigen, ob es eine Config dafür gibt oder ob ich das rausschmeiße im Code. (Wie hast du das gemacht mit Änderungen? Speichert man dann ein eigenes Addon? Sonst wird das beim Update überschrieben, oder?)
In XML ist (IMHO) alles erlaubt - deshalb gibt es dann die Dokumentendefinitionen. Es gibt nicht DAS eine XML-Format als Dokumententyp...

Es hindert dich niemand daran, GXML und/oder JKI EasyXML als Vorlage zu nehmen und dir daraus einen Generator und Parser zu programmieren, der deinen Wünschen entspricht.

EasyXML findest du auch auf github zum herunterladen

Beide Toolkits können (mehr oder weniger) beliebig verschachtelte LabVIEW Elemente (Cluster, Array of Cluster, ...) in ein XML-Format verwandeln, und kommen dabei mit dem "Variant" Format anstatt Referenz-Geschubse aus.

Gruß, Jens


RE: PropertyNode Referenz zu Allen Array Elementen (XML schreiben) - TpunktN - 12.05.2020 08:08

Wenn man weiß, das in Variant mehr gespeichert ist als man im Variant Output sieht, dann gibt die herangehensweise Sinn.

Ich hatte mal mit Variant Eigenschaften rumprobiert, manche VI's scheinen da aber irgendwie nicht richtig zu funktionieren. (Get Variant Header war es glaube ich)

Danke für die Tipps, ich teste mal weiter. Ich stolper immer über mehr und lerne gerade gut was Smile

MfG Timo