Anfängerfragen zum Programmieren mit PureBasic.
Helmut
Beiträge: 162 Registriert: 20.09.2004 22:53
Beitrag
von Helmut » 13.02.2013 01:20
Ich habe folgende Frage: Wie lese ich diese XML aus, ich habe es mit dem Beispiel versucht, nur diese "MainNode" verstehe ich nicht..
Bitte um Hilfe mit einem einfachen Beispiel. Dafür vielen Dank !!
Mein Code sieht so aus:
Code: Alles auswählen
#XML = 1
Procedure ReadChildNodes(*Node, Tag$, List result.s())
*ChildNode = ChildXMLNode(*Node)
While *ChildNode <> 0
If GetXMLNodeName(*ChildNode) = Tag$ ; Tag gefunden
AddElement(result())
result() = GetXMLNodeText(*ChildNode)
EndIf
If XMLChildCount(*ChildNode)
ReadChildNodes(*ChildNode, Tag$, result())
EndIf
*ChildNode = NextXMLNode(*ChildNode)
Wend
EndProcedure
InitNetwork()
ReceiveHTTPFile("http://192.168.0.140/sensorList.xml", GetTemporaryDirectory()+"Example.xml")
; Suche <SensorList> in Datei Example.xml
NewList result.s()
If LoadXML(#XML, GetTemporaryDirectory()+"Example.xml")
Debug "XML_Seite gelesen"
*MainNode = MainXMLNode(#XML)
If *MainNode
Debug "ersten Eintrag gelesen"
ReadChildNodes(*MainNode, "Sensor", result())
; Ergebnisse anzeigen
ForEach result()
Debug "-> " + result()
Next
EndIf
EndIf
XML ist Dieses:
Code: Alles auswählen
<?xml version="1.0" encoding="ISO-8859-1"?>
-<SensorList> -<Sensor> <ID>Nr 1</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02687</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 2</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02681</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 3</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02662</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 4</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02662</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 5</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02593</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 6</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02581</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 7</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02543</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 8</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02537</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 9</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02525</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 10</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02493</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 11</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02456</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 12</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02468</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 13</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02456</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr14</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>02425</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 15</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>00000</Value> <Display>021</Display> </Sensor> -<Sensor> <ID>Nr 16</ID> <Type>005</Type> <Min>02000</Min> <Max>03000</Max> <Value>00000</Value> <Display>021</Display> </Sensor> </SensorList>
Kiffi
Beiträge: 10711 Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
Beitrag
von Kiffi » 13.02.2013 02:14
wg. der vorgerückten Stunde hier nur der Code (so wie ich es realisieren würde) ohne Erklärung:
Code: Alles auswählen
EnableExplicit
Define RootNode
Define SensorListNode
Define SensorNode
#XML = 1
Structure sSensor
ID.s
Type.s
Min.s
Max.s
Value.s
Display.s
EndStructure
NewList Sensor.sSensor()
If LoadXML(#XML, GetTemporaryDirectory()+"Example.xml")
RootNode = RootXMLNode(#XML)
If RootNode
SensorListNode = XMLNodeFromPath(RootNode, "SensorList")
If SensorListNode
SensorNode = XMLNodeFromPath(SensorListNode, "Sensor")
While SensorNode
AddElement(Sensor())
Sensor()\ID = GetXMLNodeText(XMLNodeFromPath(SensorNode, "ID"))
Sensor()\Type = GetXMLNodeText(XMLNodeFromPath(SensorNode, "Type"))
Sensor()\Min = GetXMLNodeText(XMLNodeFromPath(SensorNode, "Min"))
Sensor()\Max = GetXMLNodeText(XMLNodeFromPath(SensorNode, "Max"))
Sensor()\Value = GetXMLNodeText(XMLNodeFromPath(SensorNode, "Value"))
Sensor()\Display = GetXMLNodeText(XMLNodeFromPath(SensorNode, "Display"))
SensorNode = NextXMLNode(SensorNode)
Wend
EndIf
EndIf
FreeXML(#XML)
EndIf
; Ergebnisse anzeigen
ForEach Sensor()
Debug "ID: " + Sensor()\ID
Debug "Type: " + Sensor()\Type
Debug "Min: " + Sensor()\Min
Debug "Max: " + Sensor()\Max
Debug "Value: " + Sensor()\Value
Debug "Display: " + Sensor()\Display
Debug "---"
Next
Denke, dass Du damit was anfangen kannst.
Grüße ... Kiffi
a²+b²=mc²
Helmut
Beiträge: 162 Registriert: 20.09.2004 22:53
Beitrag
von Helmut » 13.02.2013 12:33
Vielen Dank !!
Dass Du das um diese Zeit so ebenmal hinzauberst..... Respekt.
Aber,
In's Root komme ich nicht...
Habe Debug's gesetzt
Code: Alles auswählen
EnableExplicit
Define RootNode
Define SensorListNode
Define SensorNode
#XML = 1
Structure sSensor
ID.s
Type.s
Min.s
Max.s
Value.s
Display.s
EndStructure
NewList Sensor.sSensor()
InitNetwork()
ReceiveHTTPFile("http://192.168.0.140/sensorList.xml", GetTemporaryDirectory()+"Example.xml")
; Suche <Test> in Datei Test.xml
If LoadXML(#XML, GetTemporaryDirectory()+"Example.xml")
RootNode = RootXMLNode(#XML)
Debug "drin1" ; funktioniert
If RootNode
Debug "drin2" ; funktioniert
SensorListNode = XMLNodeFromPath(RootNode, "SensorList")
If SensorListNode
Debug "drin3" ; funktioniert nothing
SensorNode = XMLNodeFromPath(SensorListNode, "Sensor")
While SensorNode
AddElement(Sensor())
Sensor()\ID = GetXMLNodeText(XMLNodeFromPath(SensorNode, "ID"))
Sensor()\Type = GetXMLNodeText(XMLNodeFromPath(SensorNode, "Type"))
Sensor()\Min = GetXMLNodeText(XMLNodeFromPath(SensorNode, "Min"))
Sensor()\Max = GetXMLNodeText(XMLNodeFromPath(SensorNode, "Max"))
Sensor()\Value = GetXMLNodeText(XMLNodeFromPath(SensorNode, "Value"))
Sensor()\Display = GetXMLNodeText(XMLNodeFromPath(SensorNode, "Display"))
SensorNode = NextXMLNode(SensorNode)
Wend
EndIf
EndIf
FreeXML(#XML)
EndIf
helpy
Beiträge: 636 Registriert: 29.08.2004 13:29
Beitrag
von helpy » 13.02.2013 12:59
Füge doc mal nach de LoadXML() folgende Zeilen ein:
Code: Alles auswählen
If XMLStatus(#XML) <> #PB_XML_Success
MessageRequester( "XML Error", "Error: " + XMLError(#XML) )
End
EndIf
Bei mir funktioniert der Code!
Ich habe jedoch die XML-Datei lokal gespeichert und hole sie nicht erst über ReceiveHTTPFile.
Wie sieht denn Deine XML-Datei aus?
Wenn sie wirklich so aussieht, wie oben im ersten Beitrag, dann ist das kein valides XML.
lg,
guido
Zuletzt geändert von
helpy am 13.02.2013 13:08, insgesamt 1-mal geändert.
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Helmut
Beiträge: 162 Registriert: 20.09.2004 22:53
Beitrag
von Helmut » 13.02.2013 13:05
Dann kommt der Requester: Error: syntax error
Muß die erste Zeile beachtet werden: <?xml version="1.0" encoding="ISO-8859-1"?> ??
Stört Die?
helpy
Beiträge: 636 Registriert: 29.08.2004 13:29
Beitrag
von helpy » 13.02.2013 13:08
Hier die bereinigte XML-Datei:
Code: Alles auswählen
<?xml version="1.0" encoding="UTF-8"?><SensorList><Sensor><ID>Nr 1</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02687</Value><Display>021</Display></Sensor><Sensor><ID>Nr 2</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02681</Value><Display>021</Display></Sensor><Sensor><ID>Nr 3</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02662</Value><Display>021</Display></Sensor><Sensor><ID>Nr 4</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02662</Value><Display>021</Display></Sensor><Sensor><ID>Nr 5</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02593</Value><Display>021</Display></Sensor><Sensor><ID>Nr 6</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02581</Value><Display>021</Display></Sensor><Sensor><ID>Nr 7</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02543</Value><Display>021</Display></Sensor><Sensor><ID>Nr 8</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02537</Value><Display>021</Display></Sensor><Sensor><ID>Nr 9</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02525</Value><Display>021</Display></Sensor><Sensor><ID>Nr 10</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02493</Value><Display>021</Display></Sensor><Sensor><ID>Nr 11</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02456</Value><Display>021</Display></Sensor><Sensor><ID>Nr 12</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02468</Value><Display>021</Display></Sensor><Sensor><ID>Nr 13</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02456</Value><Display>021</Display></Sensor><Sensor><ID>Nr14</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>02425</Value><Display>021</Display></Sensor><Sensor><ID>Nr 15</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>00000</Value><Display>021</Display></Sensor><Sensor><ID>Nr 16</ID><Type>005</Type><Min>02000</Min><Max>03000</Max><Value>00000</Value><Display>021</Display></Sensor></SensorList>
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Helmut
Beiträge: 162 Registriert: 20.09.2004 22:53
Beitrag
von Helmut » 13.02.2013 13:12
Bereinigt...? Die Datei kann ich nicht vorher bereinigen, die kommt aus einem Gerät über die IP-Adresse.
Bzw, wie mache ich das?
Gruß und vielen Dank für die Hilfe, Helmut
PS: habe Deine Datei mal auf C: geladen, Syntax-Fehlermeldung ist weg, Sensordaten kommen aber nicht.
Edit 2 Doch !!! war mein Fehler, die kommen jetzt !!
helpy
Beiträge: 636 Registriert: 29.08.2004 13:29
Beitrag
von helpy » 13.02.2013 13:46
Helmut hat geschrieben: Bereinigt...? Die Datei kann ich nicht vorher bereinigen, die kommt aus einem Gerät über die IP-Adresse.
Bzw, wie mache ich das?
Kannst Du die XML-Datei, welche Du im Temp-Verzeichnis speicherst, hier irgendwo als Download anbieten, damit mit man die Datei analysieren kann, was nun wirklich der Fehler ist (beim Einfügen über die Zwischenablage ins Forum, wird das Ergebnis evt. verfälscht).
Korrigieren könntest Du die runtergeladene XML-Datei direkt per Programm ... und erst danach per LoadXML einlesen.
Aber dazu müsste man wissen, wo der Fehler wirklich liegt.
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Kurzer
Beiträge: 1617 Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg
Beitrag
von Kurzer » 13.02.2013 13:51
<nen-bisschen-OT>
Hallo, wo ich gerade hier drüber stolpere.
Was ist eigentlich der Vorteil an XML Dateien?
Wenn man mal von den Struktur der einführenden und abschließenden tags absieht, dann liegen die Daten doch eigentlich auch nur sequentiell in der Datei.
Wo liegt der konkrete Vorteil z.B. zu einer Prefs-Datei oder einer ganz normalen, sequentiell beschriebenen ASCII Datei mit eigener Struktur?
Ich sehe da momentan nur einen Overhead in der Dateigröße. Ok, bei Datenfehler könnte man den Einleseprozess vermutlich ab dem nächsten tag wieder korrekt synchronisieren, aber das ginge ja auch bei bei den anderen Methoden.
</nen-bisschen-OT>
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder? "
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Helmut
Beiträge: 162 Registriert: 20.09.2004 22:53
Beitrag
von Helmut » 13.02.2013 13:54
Direkten Zugriff kann ich nicht anbieten, läuft im priv. Netz.
Gezippt reicht?..... kann man hier nichts anhängen...
Zuletzt geändert von
Helmut am 13.02.2013 14:18, insgesamt 1-mal geändert.