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:  10715  		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:  1618  		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.12 x64, OS:  Win 11 24H2 x64, Desktopscaling:  150%, CPU:  I7 12700 H, RAM:  32 GB, GPU:  Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070 
Useralter in 2025: 57 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.