XML-Dastellungs Problem

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

XML-Dastellungs Problem

Beitrag von pluto »

Hallo,
ich bin gerade dabei in meinem PLEDITOR ein einfaches Datei Format in XML zu entwickeln. Allerdings habe ich jetzt ein kleines Problem. Da weiß ich einfach nicht mehr weiter. Evlt. kann ja einer von euch weiter helfen.

Ich nutze XMLReader und DOM. Was Standard gemäß bei Lazarus bzw. FPC Dabei ist.

Also hier ersteinmal die XML Datei:

Code: Alles auswählen

<?xml version="1.0"?>
<Text>
<NewLine>
  Der Himmel ist heute <Font BGCOLOR="clBlack" FGColor="clLime">Blau</Font> und die Sonne 
<Font BGColor="clRed">scheint </Font>
</NewLine>
 
<NewLine>
</NewLine>
 
<NewLine>
Text1 Text2 Text3
</NewLine>
 
<NewLine>
Text1 <Font FGColor="clBlue" BGColor="clLime">T<Font bgColor="clRed">ex</Font>t2</Font> Text3
</NewLine>
 
<NewLine><Font BGCOLOR="clLime" FGCOLOR="clYellow">schön warm</Font> vom Himmel.</NewLine>
</Text>
Der Text ergibt nicht viel sinn. Soll er auch gar nicht. Das Problem ist in dieser Zeile:
Text1 <Font FGColor="clBlue" BGColor="clLime">T<Font bgColor="clRed">ex</Font>t2</Font> Text3
Da stellen tut er es, aber anscheint gibt es beim Verschachteln von Tag's Probleme.
Ich hätte folgendes jetzt erwartet:
Das Große T wird richtig da gestellt, das ex auch aber t2 nicht mehr. t2 wird in der Default Farbe angezeigt und nicht Grün/Blau.
Im Anhang habe ich noch ein Bild für euch.
Hier der Code:
wegen dem Verschachteln von Tag's habe ich extra eine StyleListe eingeführt. Der Kern Code stammt aus dem XML Beispiel von der Lazarus-Wiki Seite. Ich habe den code einfach nur angepasst. Das meiste geht ja auch, aber ich finde einfach den Fehler nicht. Hier der Code:

Code: Alles auswählen

function TPLEditorTextList.LoadFromXMLFile(const aXMLFile: String): Integer;
var
  Documento: TXMLDocument;
  iNode: TDOMNode;
  Line:TPLEditorTextLine;
  currItem:TPlEditorTextItem;
  SaveStyle:TPlEditorTextStyle;
  StyleListe:TObjectList;
  SaveChange:Boolean;
 
 procedure ProcessNode(Node: TDOMNode);
  var
    cNode: TDOMNode;
    i:Integer;
    str,strv:string;
  begin
    if Node = nil then Exit;
 
    if Node.HasAttributes then begin
     // Der Aktuelle Style wird gespeichert in einer Liste
      SaveStyle:=TPlEditorTextStyle.Create;
      SaveStyle.Assign(DefaultStyle);
//      writeln(ColorToString(DefaultStyle.BrushColor));
      StyleListe.Add(SaveStyle);
      SaveChange:=True;
      for I:=0 to Node.Attributes.Length-1 do begin
        str:=UpperCase(Node.Attributes[i].NodeName);
        strv:=Node.Attributes[i].NodeValue;
        if str = 'BGCOLOR' then begin
          DefaultStyle.BrushColor:=StringToColor(strv);
        end;
        if str = 'FGCOLOR' then
          DefaultStyle.FontColor:=StringToColor(strv);
      end; // for i
    end
    else begin
      str:=node.NodeValue;
      if pos(#10,str) >0 then begin
        Delete(str,pos(#10,Node.NodeValue),1);
        Node.NodeValue:=str;
      end;
      if Node.NodeName = 'NewLine' then
        Line:=AddLine(Node.NodeValue)
      else
        line.AddTextItem(Node.NodeValue, DefaultStyle);
     // Der Vorherige Style wird wieder hergestellt
      if SaveChange then begin
        SaveStyle:=TPlEditorTextStyle(StyleListe[StyleListe.Count-1]);
 
        DefaultStyle.Assign(SaveStyle);
        StyleListe.Delete(StyleListe.Count-1);
        SaveStyle:=nil;
 
        SaveChange:=False;
      end;
    end; // else begin
    cNode := Node.FirstChild;
    while cNode <> nil do begin
      ProcessNoDe(cNode);
      cNode := cNode.NextSibling;
    end; // while
  end;
begin
  StyleListe:=TObjectList.Create;
  ReadXMLFile(Documento, aXMLFile);
  iNode := Documento.DocumentElement.ChildNodes.Item[0];
  SaveChange:=False;
  while iNode <> nil do begin
    ProcessNode(iNode); // Rekursiv
    iNode := iNode.NextSibling;
  end;
 Documento.Free;
end; // TPLEditorTextList.LoadFromXMLFile
Vielen Dank !
PS: Sehe ich das richtig das es für XML Dateien kein Highlighter gibt ? hier im Forum ?
Dateianhänge
plEditor2.jpg
Zuletzt geändert von pluto am So 22. Feb 2009, 19:26, insgesamt 1-mal geändert.
MFG
Michael Springwald

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: XML-Dastellungs Problem

Beitrag von _X_ »

einen Highlighter gibt es:

Code: Alles auswählen

<?xml version="1.0"?>
<Text>
<NewLine>
  Der Himmel ist heute <Font BGCOLOR="clBlack" FGColor="clLime">Blau</Font> und die Sonne 
<Font BGColor="clRed">scheint </Font>
</NewLine>
 
<NewLine>
</NewLine>
 
<NewLine>
Text1 Text2 Text3
</NewLine>
 
<NewLine>
Text1 <Font FGColor="clBlue" BGColor="clLime">T<Font bgColor="clRed">ex</Font>t2</Font> Text3
</NewLine>
 
<NewLine><Font BGCOLOR="clLime" FGCOLOR="clYellow">schön warm</Font> vom Himmel.</NewLine>
</Text>
Im Code kann ich keinen Fehler finden.

mfg _X_

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: XML-Dastellungs Problem

Beitrag von pluto »

Danke für den Hinweis. ich dachte die Comobox würde alle enthalten. Aber das scheint nicht zu stimmen.

Zum Code: Ich nehme an es liegt an der art und weise wie ich die XML Datei lade bzw. verarbeitet.
Aber ich komme einfach nicht dahinter. Eine kleine Freude ist das ich so weit gekommen bin mit einer Fertigen LIB. Ich wollte erst schon ein eigene schreiben. Aber ich dachte mir für mein zweck reicht die eigentlich voll und ganz aus.
MFG
Michael Springwald

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: XML-Dastellungs Problem

Beitrag von KOBOLD Messring GmbH »

Bin kein XML-Spezialist, aber analog zu HTML (was ja angeblich nur ein abgespecktes XML ist), kann ich sagen:
Dein </Font> hinter dem "ex" beendet SÄMTLICHE vorher gesetzten Font-Definitionen und alles ist wieder standard.
Dein zweites </Font> müsste - strenggenommen - ein XML-Syntax-Error sein, da man nicht gleiche Tags schachteln kann.
Kein Syntax-Checker wird Dir das allerdings melden, da die ja nicht soooo streng wie z.B. ein Pascal-Compiler sind :wink:
Aber generell musst Du neue Attribute immer mit neuen <Font ...> Tags setzen oder überschreiben und am Schluss mit EINEM </Font> alles beenden und damit wieder auf Standard setzen

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: XML-Dastellungs Problem

Beitrag von pluto »

Ich habe bei SELFHATML gelesen das man in XML auch Elemente verschachteln kann. oder habe ich das jetzt Falsch verstanden ?

Also gibt es bei XML keine Möglichkeit für sowas ?
MFG
Michael Springwald

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: XML-Dastellungs Problem

Beitrag von KOBOLD Messring GmbH »

Wie gesagt, ich bin leider NICHT der Experte für XML. Speziell mit den <Font> und </Font> Sachen habe ich aus eigener Erfahrung mit HTML berichtet.
Verschachteln kann man prinzipiell verschiedene Tags, z.B. erst kursiv, dann unterstrichen, dann kursiv-wieder-weg und so weiter, aber die gleichen Tags, wie z.B. <Font> wage ich zu bezweifeln.
Also zumindest ein Webbrowser (egal ob Firefox, Konqueror, oder IE) wird das nie so geschachtelt verstehen (und wiedergeben), wie man (als Mensch) sich das denkt, auch aus eigener Erfahrung (und Verzweiflung) über Web-Programmierung berichtet.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: XML-Dastellungs Problem

Beitrag von pluto »

Ich glaube du verwechselst gerade XML und HTML. Font ist mein eigenes Element. Es soll halt alle Font Eigenschaften wie z.b. Hintergrund und Fordergrund Farbe beschreiben. Mehr nicht.

Ich würde gerne irgendwie auf das End Tag treffen. Oder habe ich die Funktion die ich kopiert habe aus dem XML Tutorial falsch verstanden ?
MFG
Michael Springwald

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: XML-Dastellungs Problem

Beitrag von KOBOLD Messring GmbH »

Tschuldigung wenn ich mich missverständlich ausgedrückt habe:
Ich weiss dass HTML <> XML ist (Ich habe mal gelernt, dass HTML eine Untermenge von XML ist). Deshalb GLAUBE ich, dass bei beiden Dingen die gleichen Gesetzmässigkeiten gelten. Und habe deshalb den - nicht verifizierten und nur vermuteten Rückschluss gemacht, dass was bei HTML nicht geht auch bei XML im Allgemeinen nicht funktionieren wird.
Mir ist schon klar, dass Du selber die Tags auswertest, aber wie ich dem Post entnommen habe, verwendest Du doch die Standardkomponenten XML-Reader und DOM, und deshalb dachte ich, die verhalten sich genauso wie die bekannten Webbrowser (die ja intern auch nix anderes machen werden). Und dein gezeigtes Ergebnis sieht ganz danach aus. Tut mir Leid, wenn ich Dir da nicht weiterhelfen kann.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: XML-Dastellungs Problem

Beitrag von pluto »

Naja, im allgemeinen kann HTML glaube ich sowas. Aber das Spielt auch keine rolle. Es sei den es wird noch eine Lösung gefunden. Ich versuche jetzt ein eigenen kleinen XML Parser zu schreiben der das macht was ich möchte ! Eigentlich schade. Ich hatte gehofft auf was Fertiges zurückgreifen zu können.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: XML-Dastellungs Problem

Beitrag von Christian »

XML kan genauso wie HATML auch verchaschtelt wern.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: XML-Dastellungs Problem

Beitrag von creed steiger »

Schau dir mal das Beispielprogramm xmldump unter

fpcsrc/packages/fcl-base/examples

an.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: XML-Dastellungs Problem

Beitrag von pluto »

Danke, für den hinweis. Da waren noch mehr Tolle beispiele....
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: XML-Dastellungs Problem

Beitrag von pluto »

Dank, dem Beispiel konnte ich das Problem lösen. Ich habe die Procedure vom Beispiel einfach angepasst. Ich werde natürlich drauf hinweisen...
Habt ihr Vorschläge wie diese Mehtode noch optimieren könnte, vereinfachen könnte ?

Code: Alles auswählen

function TPLEditorTextList.LoadFromXMLFile(const aXMLFile: String): Integer;
var
  xml: TXMLDocument;
  line:TPLEditorTextLine;
  Item:TPlEditorTextItem;
  n,s:Boolean;
  z:Integer;
  SaveStyle:TPlEditorTextStyle;
 
  procedure DumpNode(node: TDOMNode);
  var
    i,x: Integer;
    attr: TDOMNode;
    str:String;
  begin
    if Copy(node.NodeName, 1, 1) <> '#' then begin
      if node.NodeName = 'Font' then begin
        inc(z);
        if (node.HasAttributes) and (node.Attributes.Length > 0) then begin
          for i:=0 to node.Attributes.Length-1 do begin
            if node.Attributes[i].NodeName = 'BGCOLOR' then begin
              SaveStyle.BrushColor:=StringToColor(node.Attributes[i].NodeValue);
            end;
 
            if node.Attributes[i].NodeName = 'FGCOLOR' then
              SaveStyle.FontColor:=StringToColor(node.Attributes[i].NodeValue);
          end; // for i
        end; // node.HasAttributes and node.Attributes.Length
      end; // Font
 
      if node.NodeName = 'NewLine' then begin
        line:=AddLine(''); n:=True; z:=0;
      end; // NewLine
    end; // if copy = #
 
 
    if node.NodeValue <> '' then begin
      if node.NodeType = 3 then begin
        str:=node.NodeValue;
        x:=pos(LineEnding,str);
        if x > 0 then Delete(str,x,1);
        if n then begin
          line[0].Text:=str;
          line[0].TextStyle.Assign(SaveStyle);
          n:=False;
        end
        else begin
          line.AddTextItem(str,SaveStyle);
        end;
        s:=True;
      end;
    end;
 
    if node.FirstChild <> nil then DumpNode(node.FirstChild); // ' '
 
    if node.NextSibling <> nil then begin
      // Für das Verschachteln von Tags zuständig
      if (node.NodeName = 'Font') and (s) then begin
        if z -1 >=0 then dec(z);
        if z = 0 then
          SaveStyle.Assign(DefaultStyle)
        else
          SaveStyle.Assign(line[z].TextStyle);
        s:=False;
      end;
      DumpNode(node.NextSibling);
    end;
  end;
begin
  SaveStyle:=TPlEditorTextStyle.Create;
  SaveStyle.Assign(DefaultStyle);
  z:=0; s:=False;
  n:=False;
  ReadXMLFile(xml,aXMLFile);
  DumpNode(xml);
end; // TPLEditorTextList.LoadFromXMLFile
Das größte Problem war das Verschachteln.... Jetzt habe ich auch eine Wage Vorstellung darüber wie das mit den Bäumen gemeint sein könnte. Aber ich bleibe erstmal bei meiner gewählten Struktur. Die XML Lade Funktion habe ich auch nur eingebaut um einen längeren Text schreiben zu können und um die Scroll Funktion einbauen zu können. Sonst gibt es eigentlich keinen besonderen Grund. Eigentlich wollte ich auch zuerst ein Binäres Dateiformat einbauen. Aber das ist auch nicht schlecht.
MFG
Michael Springwald

Antworten