DOM erzeugen?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: DOM erzeugen?

BeitragSo, Okt 27, 2013 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe ein kleines Problem: Ich möchte aus einem HTML-Dokument ein Document Object Model erstellen. Dafür habe ich mir eine Funktion geschrieben, die mir zunächst alle Tags aus diesem HTML-Dokument liefert und diesen dann einer Ebene zuordnet (<html> ist Ebene 1, <head> und <body> 2, usw.). Das HTML-Dokument sieht folgendermaßen aus Code:
<html>
   <head><title>Hallo</title></head>
   <body>
      <p>Dies ist ein Test</p>Test
      <span>Hallo</span>
   </body>
</html>


Die Funktion erstellt daraus folgende Tag-Struktur Zitat:
DebugLog:<html> (1)
DebugLog:<head> (2)
DebugLog:<title> (3)
DebugLog:<body> (2)
DebugLog:<p> (3)
DebugLog:<span> (3)
In Klammern die jeweilige Ebene des Tags (Das scheint auch soweit richtig zu sein)

Die Funktion sieht bis jetzt so aus BlitzMax:
Type TDocumentObject
Field Name:String
Field Parent:TDocumentObject
Field Stage:Int

Function Create:TDocumentObject(Name:String, Stage:Int)
Local ReturnMe:TDocumentObject = New TDocumentObject
ReturnMe.Name = Name
ReturnMe.Stage = Stage
Return ReturnMe
End Function
End Type

Function GetStringBetween:String(str:String, StartChar:String, EndChar:String, StartPos:Int = 0)
Local startcharpos:Int = Instr(str, StartChar, StartPos)
If(startcharpos = 0) ' Nicht gefunden
Return ""
EndIf

Local endcharpos:Int = Instr(str, EndChar, StartPos)
If(startcharpos > 0 And endcharpos > 0)
Local length:Int = endcharpos - startcharpos

Return Mid(str, startcharpos, (length + 1))
Else
Return ""
EndIf
End Function


Function HTMLEdit_UpdateStructwatch(File:String)
If(FileType(File) = 1)
ClearTreeView(htmledit_panel_structwatch)

Local BaseNode:TGadget = AddTreeViewNode(StripDir(File), TreeViewRoot(htmledit_panel_structwatch))
Local ReadMe:TStream = ReadFile(File)
Local Line:String

Local ObjectList:TList = CreateList()
Local ThisObj:TDocumentObject = Null
Local MomStage:Int = 0

' Zunächst ALLE Tags in die Liste:
Repeat
Line = Trim(ReadLine(ReadMe))
If(Line <> "")
Local NewPos:Int
For Local MomPos:Int = 1 To (Len(Line) - 2)
NewPos = Instr(Line, "<", MomPos)
If(NewPos >= 1)
Local Name:String = Trim(GetStringBetween(Line, "<", ">", NewPos))

If(Name <> "" And Left(Name, 3) <> "<br" And Left(Name, 2) <> "<!" And Left(Name, 2) <> "<?")
ThisObj = TDocumentObject.Create(Name, MomStage)

If(Left(Name, 2) = "</")
MomStage = MomStage - 1
Else
MomStage = MomStage + 1
EndIf

If(Left(Name, 2) <> "</")
ThisObj.Name = ThisObj.Name + " (" + MomStage + ")"
DebugLog ThisObj.Name
ListAddLast(ObjectList, ThisObj)
EndIf
EndIf

MomPos = Instr(Line, ">", NewPos)
EndIf
Next
EndIf
Until Eof(ReadMe)
CloseFile(ReadMe)

Local TempObject:TDocumentObject
Local PrevObj:TDocumentObject = Null
MomStage = 0

For TempObject = EachIn ObjectList
AddTreeViewNode(TempObject.Name, BaseNode)
Next
EndIf
End Function


Meine Frage ist jetzt: Wie kann ich daraus jetzt die Beziehungen erzeugen?
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 So, Okt 27, 2013 17:50, insgesamt 2-mal bearbeitet

Tennisball

BeitragSo, Okt 27, 2013 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.

Erstens: Dein Code ist extrem schwer zu lesen, da du viel zu viele Einrückungsstufen hast. Versuche das mal lesbarer zu machen, indem zu z.B. Teile davon in neue Funktionen packst (Natürlich nur so, wie es noch Sinn ergibt).

Um deine Frage zu beantworten:
- Du musst deine Liste durchgehen
- Für jede Ebene packst du jeweils den letzten Tag in eine Variable
- Der Parent eines Tags ist immer der letzte Tag mit der "um 1 kleineren" Ebene

Pseudo-Code:
Code:
For tag = EachIn tags
   lastTag( tag.ebene ) = tag
   tag.parent = lastTag( tag.ebene - 1 )
Next


Gruß,
Tennisball

BtbN

BeitragSo, Okt 27, 2013 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder nimm doch einfach ein libxml modul, das tut zimlich genau das.
 

CO2

ehemals "SirMO"

BeitragFr, Nov 01, 2013 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, vielen Dank für die Antworten!

@ Tennisball: In der MaxIDE habe ich eingestellt, dass ein Tab 4 Leerzeichen entspricht und da ist das gut lesbar... Hier im Code-Tag sieht es tatsächlich etwas seltsam aus Wink

Ich versuche deine Lösung mal umzusetzen

@ BtbN: Das wäre viel zu einfach Wink Ich versuche es erstmal selbst umzusetzen...
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 BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group