XML auslesen, mainNode.... kann man den ändern?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

XML auslesen, mainNode.... kann man den ändern?

Beitrag von Helmut »

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>
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: XML auslesen, mainNode.... kann man den ändern?

Beitrag von Kiffi »

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²
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

Re: XML auslesen, mainNode.... kann man den ändern?

Beitrag von Helmut »

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
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: XML auslesen, mainNode.... kann man den ändern?

Beitrag von helpy »

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)
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

Re: XML auslesen, mainNode.... kann man den ändern?

Beitrag von Helmut »

Dann kommt der Requester: Error: syntax error

Muß die erste Zeile beachtet werden: <?xml version="1.0" encoding="ISO-8859-1"?> ??
Stört Die?
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: XML auslesen, mainNode.... kann man den ändern?

Beitrag von helpy »

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)
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

Re: XML auslesen, mainNode.... kann man den ändern?

Beitrag von Helmut »

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 !!
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: XML auslesen, mainNode.... kann man den ändern?

Beitrag von helpy »

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)
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: XML auslesen, mainNode.... kann man den ändern?

Beitrag von Kurzer »

<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.
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

Re: XML auslesen, mainNode.... kann man den ändern?

Beitrag von Helmut »

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.
Antworten