[GELÖST] XML Reader basteln?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] XML Reader basteln?

BeitragFr, Apr 08, 2011 21:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich wollte mal fragen, wie man in BB .xml dateien ausliest. Da ich davon ausgehe, dass es keine vorgefertigten Funktionen dafür gibt, wollte ich nun selbst ein paar (?) schreiben. so sähe zum beispiel eine Datei aus:
Code: [AUSKLAPPEN]
<vehicle name="Bus">
   <vehdata>
      <id>$veh_bus$</id>
      <containername>3d\vehicle.co2</containername>
      <maxspeed>80</maxspeed>
      <ps>120</ps>
      <cylinder>6</cylinder>
      <fuelusage>0.005</fuelusage>
      <drive acceleration="0.0005" decceleration="0.001"/>
      <seat>48</seat>
   </vehdata>
   <3d>
      <main file="Bus.x" posx="0" posy="0" posz="0"/>
      <wheels>
         <frontright file="BusRR.x" posx="nA" posy="nA" posz="nA"/>
         <frontleft file="BusRL.x" posx="nA" posy="nA" posz="nA"/>
         <backright file="BusRR.x" posx="nA" posy="nA" posz="nA"/>
         <backleft file="BusRL.x" posx="nA" posy="nA" posz="nA"/>
      </wheels>
   </3d>
   <attribute name="bus"/>
</vehicle>


So, und wie kann ich nun eine Variable auslesen? und vor allen dingen: wie läuft das bei den "befehlen" mit mehreren parametern (z.B.: die unter "<wheels>").
Ich wüsste jetzt nicht, wie ich die ganzen Stringbefehle einsetzen müsste (Right(), Left(), InStr()), um eine Variable auszulesen, außerdem sollte er es nicht statisch auslesen, also zeile für zeile und dann einfach die "befehle" wegmachen und die werte so übertragen, sondern auch den variablen die richtigen werte zuweisen, wenn die "befehle" vertauscht sind.

Ich entschuldige mich schonmal im vorraus für eventuelle ausdrucksfehler, bin grad ein wenig unter zeitdruck Wink

danke schonmal im vorraus,
mfG;
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Sa, Apr 09, 2011 13:29, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragFr, Apr 08, 2011 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das ist kompliziert und für Anfänger nicht unbedingt empfehlenswert. Wenn du es versuchst, solltest du mit den String Funktionen umgehen können. Den geparsten XML-Baum könnte man in Types speichern, da können die Knoten miteinander verknüpft sein und über passende Funktionen kann man die richtigen Knoten/Werte 'raussuchen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Blitzprogger

BeitragFr, Apr 08, 2011 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz ganz einfach könnte das so aussehen.
Pseudocode BlitzBasic: [AUSKLAPPEN]
txt$ = ReadLine (file)
ding1 = Instr (txt$,"<") ; findet befehlsanfang
If ding1 Then
ding2 = Instr (txt$,">",ding1) ; findet befehlende
befehl$ = Mid (txt$,ding1+1,ding2-ding1-1) ; liest den befehl
ding3 = Instr (txt$,"<",ding2) ; findet variabelende
wert$ = Mid (txt$,ding2+1,ding3-ding2-1) ; liest den wert
EndIf

Auf diese Weise funktioniert es mit ganz einfachen Teilen wie:
<elite>1337</elite>
Wenn du es zu mehr fähig machen willst, so musst du den obigen Teil noch ziemlich was ausbauen.

Hoffe es hat geholfen. ^^

mfg, Blitzprogger
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink
 

CO2

ehemals "SirMO"

BeitragSa, Apr 09, 2011 11:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke für die Hilfe... Ich werd mich mal dransetzen ;D
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

darth

BeitragSa, Apr 09, 2011 11:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

so unheimlich kompliziert ist es eigentlich gar nicht. Du musst wissen wie man mit einem Stack umgeht und dann noch die wichtigsten String-Manipulationen kennen:
Instr, Mid, (Left, Right), Lower, (Upper)
Edit: Jetzt weiss ichs \o/

Danach kannst du einfach jede Zeile nacheinander abarbeiten. Wenn ein neues Objekt kommt, legst dus auf den Stack, wenn die Beschreibung fertig ist, nimmst dus wieder raus. Die Objekte können eigentlich alles sein.. Du musst einfach nachher noch irgend einen Zugriff drauf haben (also entweder Types, oder einen zweiten Stack).
Für die Zeilen würde ich dir empfehlen, sie in Einzelteile aufzusplitten. Dass du dir also Splitter definierst (z.b einen Leerschlag (nicht sehr empfehlenswert.. aber so hast dus in deinem Bsp gemacht..) oder ein Komma). Danach kannst du einfach den String, solange er Splitter enthält, aufteilen und abspeichern. Danach kannst du dann die einzelnen Splits durchgehen und dir die Attribute aussuchen.
Natürlich brauchst du auch eine Liste mit "Codewörtern", dass der Interpreter auch versteht, was er mit einem "SEAT" anfangen soll.

Falls du noch ein weiteres Beispiel brauchst, könntest du dir sowas anschauen oder dir dasda runterladen. Das sind Beispiele von mir, die ich für Figuren verwendet habe.

Als wichtigsten Tip (da ich das Ding auch schon komplett neu geschrieben habe..) kann ich dir anraten, den Code angenehm zu formatieren und nach Zusammengehörigkeit zu sortieren. Bei vielen Codewörtern kann es extrem unübersichtlich werden, was wo wie dazugehört..

MfG,
Darth
  • Zuletzt bearbeitet von darth am Sa, Apr 09, 2011 11:55, insgesamt einmal bearbeitet

ZaP

BeitragSa, Apr 09, 2011 11:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Falls Du's ganz richtig machen willst, denk dir einen Automaten aus, dann kannst Du auch gleich einen Errorhandler mit einbauen. Solche Klammersprachen gehen damit ziemlich gut.
Starfare: Worklog, Website (download)
 

CO2

ehemals "SirMO"

BeitragSa, Apr 09, 2011 11:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, erstmal danke für die Hilfe!

Ich bin nun aber (mal wieder) auf ein Problem gestoßen: Ich möchte ein Array in dem Type haben, weiß aber nicht, wie ich es definieren soll. So sieht der Type Vehicle nun aus:
BlitzBasic: [AUSKLAPPEN]
Type Vehicle

Field carname$
Field ID$
Field ContainerFile$
Field maxspeed
Field horsepower
Field cylinder
Field fuelusagevalue#
Field acceleration#
Field decceleration#
Field seat

Field dreidemainfile$

;Ab hier brauche ich Arrays
Field wheelfrontrightfile$
Field wheelfrontrightposx#
Field wheelfrontrightposy#
Field wheelfrontrightposz#

Field wheelfrontleftfile$
Field wheelfrontleftposx#
Field wheelfrontleftposy#
Field wheelfrontleftposz#

Field wheelbackrightfile$
Field wheelbackrightposx#
Field wheelbackrightposy#
Field wheelbackrightposz#

Field wheelbackleftfile$
Field wheelbackleftposx#
Field wheelbackleftposy#
Field wheelbackleftposz#

End Type


Ich brauche das Array, weil ich Fahrzeuge habe, die mehrere Räder der gleichen sorte haben (siehe hier: Code: [AUSKLAPPEN]
<vehicle name="RMV">
   <vehdata>
      <id>$veh_rmv$</id>
      <maxspeed>100</maxspeed>
      <ps>1200</ps>
      <cylinder>14</cylinder>
      <fuelusage>0.0087</fuelusage>
      <drive acceleration="0.0013" decceleration="0.0026"/>
      <seat>32</seat>
   </vehdata>
   <3d>
      <main file="RMV.x" posx="nA" posy="nA" posz="nA"/>
      <wheels>
         <frontright file="RMVRR.x" posx="nA" posy="nA" posz="nA"/>
         <frontright file="RMVRR.x" posx="nA" posy="nA" posz="nA"/>
         <frontleft file="RMVRL.x" posx="nA" posy="nA" posz="nA"/>
         <frontleft file="RMVRL.x" posx="nA" posy="nA" posz="nA"/>
         <backright file="RMVRR.x" posx="nA" posy="nA" posz="nA"/>
         <backright file="RMVRR.x" posx="nA" posy="nA" posz="nA"/>
         <backleft file="RMVRL.x" posx="nA" posy="nA" posz="nA"/>
         <backleft file="RMVRL.x" posx="nA" posy="nA" posz="nA"/>
      </wheels>
   </3d>
   <attribute name="truck"/>
</vehicle>
)

Und so sieht meine xml-auslesefunktion bisher aus (ist noch nicht fertig!)
BlitzBasic: [AUSKLAPPEN]
;Konstanten
Const newveh$ = "<vehicle"
Const vehdata$ = "<vehdata>"
Const id$ = "<id>"
Const maxspeed$ = "<maxspeed>"
Const ps$ = "<ps>
Const cylinder$ = "<cylinder>"
Const fuelusage$ = "<fuelusage>"
Const drive$ = "<drive"
Const seat$ = "<seat>"
Const dreide$ = "<3d>"
Const dreidemain$ = "<main"
Const wheels$ = "<wheels>"
Const wheelfrontright$ = "<frontright"
Const wheelfrontleft$ = "<frontleft"
Const wheelbackright$ = "<backright"
Const wheelbackleft$ = "<backleft"
Const attribute$ = "<attribute"
;Konstantenende

Function ReadVehicleDef(File$)
Local Codewort$ ;auszulesendes codewort
Local xmlfile = ReadFile(File) ;Datei öffnen

Local veh.Vehicle = New Vehicle ;Neues Objekt in Type einfügen

Repeat ;Containerfile suchen
Codewort = ReadLine(xmlfile)
Until Codewort = "<file"

veh.ContainerFile = Left(Codewort, 12) ;Containerfile auslesen

Repeat

ReadLine(xmlfile) ;Solange zeilen lesen,

If Left(ReadLine(xmlfile), 8) = newveh ;bis neue Fahrzeugdefinition vorliegt

Repeat
;Hier kommt die unterscheidung der "befehle" rein
Until ReadLine(xmlfile) = "</vehicle>"

Else ;wenn keine fahrzeugdefinition vorliegt, fehler ausgeben

RuntimeError "Die Datei enthält keine Definitionen für Fahrzeuge!"

EndIf

Until Eof(xmlfile)

End Function


(btw: ich vergesse immer, wie man variablen in types anspricht Very Happy) So, das war der code (er sollte sich von allein erklären)

Achja noch ne frage: Kann man den Type und die funktion in separaten dateien speichern? Wenn ich den type z.b. im hauptprogramm habe und die funktion in einer anderen datei (und sie dann via "Include" im hauptprogramm einschließt), kann er dann trotzdem auf den type zugreifen?

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

ZaP

BeitragSa, Apr 09, 2011 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, Types sind global, die kann man überall benutzen.

Array im Type geht so in BlitzBasic: [AUSKLAPPEN]
Type MeinType
Field MeinFloatArray#[12]
End Type

Type MeinZweiterType
Field MeinTypArray.MeinType[3]
End Type


Das was Du suchst ist übrigens variable\typevariable und nicht variable.typvariable.
Starfare: Worklog, Website (download)

Hummelpups

BeitragSa, Apr 09, 2011 12:08
Antworten mit Zitat
Benutzer-Profile anzeigen
sachtma gibt es nicht schon nen XML Reader für BlitzBasic?
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Blitzprogger

BeitragSa, Apr 09, 2011 12:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe noch einen Fehler entdeckt.
Du liest Readline () mehrmals in einem Durchlauf aus, aber speicherst es in keiner Variable. Readline geht aber bei jeder Ausführung eine Linie weiter! Du hast in diesem Fall jedes mal ein anderes Ergebnis.

Fehler: BlitzBasic: [AUSKLAPPEN]
ReadLine(xmlfile) ;Solange zeilen lesen, 

If Left(ReadLine(xmlfile), 8) = newveh ;bis neue Fahrzeugdefinition vorliegt

Hier hast du unterschiedliche Ergebnisse bei Readline.
Es müsste etwa so aussehen: BlitzBasic: [AUSKLAPPEN]
derText$ = ReadLine(xmlfile) ;Solange zeilen lesen, 

If Left(derText$, 8) = newveh ;bis neue Fahrzeugdefinition vorliegt


mfg, Blitzprogger
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink
 

CO2

ehemals "SirMO"

BeitragSa, Apr 09, 2011 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles klar, danke für die hilfe!
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group