XML Parsing

Anfängerfragen zum Programmieren mit PureBasic.
Pyewacket
Beiträge: 2
Registriert: 01.11.2024 21:47

XML Parsing

Beitrag von Pyewacket »

Ich möchte die Ausgabedaten eines Webservices auswerten und ein paar Werte extrahieren.
Die Ausgabe sieht so aus:
<?xml version="1.0" encoding="utf-8"?>
<eta version="1.0" xmlns="http://www.eta.co.at/rest/v1">
<value advTextOffset="0" unit="°C" uri="/user/var/120/10101/0/0/12197" strValue="7,9" scaleFactor="10" decPlaces="1">79</value>
</eta>
Die Ausgabe des Webservice habe ich in der Stringvariable Puffer.
Mit folgenden Statements versuche ich jetz, das zu zerlegen.

Code: Alles auswählen

If ParseXML(0, Puffer)
    PrintN("ParseXML erfolgreich")
  
    xmlNode = MainXMLNode(0)

While xmlNode   
      PrintN("NodeName="+GetXMLNodeName(xmlNode) )
----
 xmlNode = NextXMLNode(xmlNode)
wend
Hier bekomme ich nur den NodeName "eta"

Wie geht es weiter?
Ich möchte die in der Zeile <value .....
stehenden Werte für advTextOffset, unit, uri, strValue, scaleFactor und decPlaces als Stringvariablen haben.
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: XML Parsing

Beitrag von jacdelad »

ExamineXMLAttributes(), siehe Beispiel in der Hilfe im Abschnitt XML.
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Pyewacket
Beiträge: 2
Registriert: 01.11.2024 21:47

Re: XML Parsing

Beitrag von Pyewacket »

Hat funktioniert aber erst als ich mit Child=ChildXMLNode(XMLNode)
den entsprechenden Node ansprechen konnte.
Irgendwie habe ich das ChildXMLNode in der Hilfe übersehen.

Soweit funktioniert das jetzt.

Nun wollte ich, da ich verschiedene gleichartig aufgebaute URLs abfragen will,
.diesen Programmteil in eine Procedure auslagern.
Leider kennt Purebasic keine Parameterübergabe byReference, die brauche ich aber da ich drei Rückgabewerte habe.

Soweit ich die Dokumentation verstehe kann man das erreichen indem ein Pointer auf den String übergeben wird.
Ich habe das so geschrieben:

Define ABC.s="XXXXXXXXXX"
Procedure XYZ( *ABC.string)
dann rufe ich die Procedur auf mit XYZ( @ABC )
Soweit funktioniert das auch, im Debugger sehe ich daß da ein Pointer übergeben wird.

Mir ist jetzt aber nicht klar wie ich im Unterprogramm etwas in die Variable schreibe.
Ich hab es mal analog zu einem Beispiel mit *ABC\s = "Inhalt" probiert aber das geht nicht.
Der Syntaxchecker bringt keine Fehlermeldung aber
wenn das Programm diese Zeile ausführen soll stürzt der Debugger ab.

Wie muss ich die Zuweisung richtig schreiben?
Oder geht das etwa gar nicht mit Stringvariablen?
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: XML Parsing

Beitrag von jacdelad »

Du solltest mit EnableExplicit arbeiten, denn ABC und *ABC sind zwei verschiedene Variablen! ByReference ist durchaus bekannt, du kannst die Adresse mehrerer Variablen mittels @ABC Übergeben und entsprechend mit den Poke-Befehlen füllen.
Einfacher wäre es jedoch, sofern es eine interne Sache ist und keine Vorgabe gibt, wenn du eine Struktur definierst und übergibst. Alle Ergebnisse in der Struktur ablegen und gut.
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: XML Parsing

Beitrag von H.Brill »

Kann man da nicht gleich mit ExtractXMLStructure() auslesen ? Die 3 Strings vorher in einer Structure
definieren. Kommt darauf an, wie die xml-datei aufgebaut ist.
PB 6.10
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: XML Parsing

Beitrag von SMaag »

Mehrere Strings von Procedure zurückgeben.
Man kann die vordefinierte StringStructure dazu verwenden. Das wird leider auf den ersten Blick in der Hilfe nicht so deutlich!

Code: Alles auswählen

EnableExplicit

Procedure StringTest(*OutStr1.String, *OutStr2.String, *OutStr3.String)
  *OutStr1\s = "ReturnStringStructure 1"
  *OutStr2\s = "ReturnStringStructure 2"
  *OutStr3\s = "ReturnStringStructure 3"

EndProcedure

Define.String S1,S2,S3


StringTest(S1,S2,S3)

Debug S1\s
Debug S2\s
Debug S3\s
vordefinierte Structures gibt es auch noch für einiges andere

.Integer
.Quad
.Long
.Word
.Byte
.Unicode

einfach mal ausprobieren oder Tools\StructureViewer verwenden und stöbern!

Ergänzung für Integer ByRef

Code: Alles auswählen

EnableExplicit

Procedure TestIntegerByRef(*Int.Integer)
  *Int\i + 1  
EndProcedure


Define MyInt=10
Define MyIntStruct.Integer 

MyIntStruct\i = 20

TestIntegerByRef(@MyInt)    ; @ notwendig

Debug MyInt

Debug ""

TestIntegerByRef(MyIntStruct)   ; @ nicht notwendig 

Debug MyIntStruct\i
Antworten