Frage zu BeniBela's XML Libary

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Frage zu BeniBela's XML Libary

Beitrag von pascalts »

Hallo!
Ich nutze mittlerweile gern die Libary von BeniBela (http://www.benibela.de/sources_en.html#internettools), es geht einfach schnell und simpel, XML auszulesen. Allerdings frage ich mich noch, wie ich mit Dopplungen umgehen soll... Denn:

Code: Alles auswählen

<DevParas>
        <DevPara DevID="10" VndID="404" DevIns="1" StatNLen="22" StatN="k3a2g1514270r03sk-1ka1" IPovDNS="false">
          <IP d1="172" d2="22" d3="26" d4="122" />
          <Mask d1="255" d2="255" d3="255" d4="0" />
          <Gate d1="172" d2="22" d3="26" d4="1" />
          <Station ExCRC="1" />
          <DevName ExCRC="1" />
          <ModEquId ExCRC="1" />
          <FDCMLFile />
          <CEId />
        </DevPara>
Diesen Teil habe ich in meiner XML-Datei mehrfach. nur StatN="..." ändert sich und <IP d1="172" d2="22" d3="26" d4="122" /> will ich auslesen. Also nutzte ich bisher:

Code: Alles auswählen

roboterip := ((process(ipdoc , '//IP/@d1' ).toString) + '.' + (process(ipdoc , '//IP/@d2' ).toString) + '.' + (process(ipdoc , '//IP/@d3' ).toString) + '.' + (process(ipdoc , '//IP/@d4' ).toString)); 
- das ließt aber nur das erste mal aus... kann man irgenwie den Pfad "//IP/@d1" verlängern? Im Endeffekt liegt das Auszulesende in \\IPPNIO\ARs\AR\DevParas\IP" ABER den Pfad gibt es mehrfach... mit diversen Parametern.

Die Datei findet ihr hier: http://pastebin.com/KZc55hPZ

Ich hoffe ihr könnt mir helfen!

BeniBela
Beiträge: 320
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Frage zu BeniBela's XML Libary

Beitrag von BeniBela »

Der Pfad und process liefern schon alle Werte. Nur toString gibt nur den ersten zurück

Mit

Code: Alles auswählen

 
var v: IXQValue;
for v in process( ... ) do  
   v.toString
 
bekommt man alle.


Code: Alles auswählen

roboterip := ((process(ipdoc , '//IP/@d1' ).toString) + '.' + (process(ipdoc , '//IP/@d2' ).toString) + '.' + (process(ipdoc , '//IP/@d3' ).toString) + '.' + (process(ipdoc , '//IP/@d4' ).toString)); 


Es ist im Allgemeinen besser process nur einmal aufzurufen und alles in XPath zu berechnen:

Code: Alles auswählen

 
roboterip :=process(ipdoc, '//IP/string-join((@d1,@d2,@d3,@d4), ".")').toString
 

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Frage zu BeniBela's XML Libary

Beitrag von pascalts »

Vielen Dank! Ich werde es gleich mal ausprobieren.

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Frage zu BeniBela's XML Libary

Beitrag von pascalts »

pascalts hat geschrieben:Vielen Dank! Ich werde es gleich mal ausprobieren.
Nun bekomme ich folgende Meldung: uroboterdokutool.pas(581,19) Error: Incompatible types: got "Char" expected "IXQValue" - diese Zeigt genau auf v. Unverständlich für mich, da ich ja v: IXQValue; deklariert hatte...

BeniBela
Beiträge: 320
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Frage zu BeniBela's XML Libary

Beitrag von BeniBela »

pascalts hat geschrieben:
pascalts hat geschrieben: uroboterdokutool.pas(581,19) Error: Incompatible types: got "Char" expected "IXQValue" - diese Zeigt genau auf v. Unverständlich für mich, da ich ja v: IXQValue; deklariert hatte...
Dann musst du das erste toString löschen

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Frage zu BeniBela's XML Libary

Beitrag von pascalts »

BeniBela hat geschrieben:Dann musst du das erste toString löschen
Ich hätte mich besser ausdrücken müssen: Es zeigt auf das v bei for v in process( ... ) do

BeniBela
Beiträge: 320
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Frage zu BeniBela's XML Libary

Beitrag von BeniBela »

pascalts hat geschrieben:Ich hätte mich besser ausdrücken müssen: Es zeigt auf das v bei for v in process( ... ) do
Ja, ich denke dann hast du nicht for v in process( ... ) do, sondern for v in process( ... ).toString do geschrieben, und das toString muss weg

Antworten