Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

AW: Sierpinski-Teppich

  Alt 26. Nov 2012, 11:46
Hier eine kleine Progrämmchen womit du die XML-Zeile in ihre Bestandteile zerlegen kannst.

Funktioniert aber auch nur in diesem speziellen Fall und die Werte sind noch in " eingeschlossen
Delphi-Quellcode:
program xmlRow;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  SysUtils, Classes;

procedure SplitXmlAttributes( const AXmlRow : string; out ATag : string; AAttributes : TStrings );
var
  LXmlInner : string;
  LValueList : TStringList;
begin

  // 1. Zeichen ("<") entfernen
  LXmlInner := Copy( Trim( AXmlRow ), 2 );
  // letzen beiden Zeichen ("/>") entfernen und Leerstellen vorne/hinten entfernen
  LXmlInner := Trim( Copy( LXmlInner, 1, Length( LXmlInner ) - 2 ) );

  LValueList := TStringList.Create;
  try

    LValueList.Delimiter := ' ';
    LValueList.StrictDelimiter := True;
    LValueList.DelimitedText := LXmlInner;

    // Der Tag steht an erster Stelle
    ATag := LValueList[0];
    LValueList.Delete( 0 );

    // Der Rest sind die Attribute
    AAttributes.Assign( LValueList );

  finally
    LValueList.Free;
  end;

end;

procedure Test;
var
  LXmlRow : string;
  LXmlTag : string;
  LXmlAttr : TStrings;
  LIdx : Integer;
begin

  LXmlAttr := TStringList.Create;
  try

    LXmlRow := '<line x1="100" y1="400" x2="500" y2="400" stroke="black" stroke-width="1" />';
    SplitXmlAttributes( LXmlRow, LXmlTag, LXmlAttr );

    Writeln( 'Tag: ', LXmlTag );
    for LIdx := 0 to Pred( LXmlAttr.Count ) do
      Writeln( LXmlAttr.Names[LIdx], ' = ', LXmlAttr.ValueFromIndex[LIdx] );

  finally
    LXmlAttr.Free;
  end;

end;

begin
  try

    Test;

  except
    on E : Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;

  ReadLn;

end.
Ausgabe
Code:
Tag: line
x1 = "100"
y1 = "400"
x2 = "500"
y2 = "400"
stroke = "black"
stroke-width = "1"
Die Attribut-Werte kannst du nun aber auch direkt durch Angabe des Attribut-Names abrufen:
Delphi-Quellcode:
var
  LXmlRow : string;
  LXmlTag : string;
  LXmlAttr : TStrings;
begin
  LXmlAttr := TStringList.Create;
  try

    LXmlRow := '<line x1="100" y1="400" x2="500" y2="400" stroke="black" stroke-width="1" />';
    SplitXmlAttributes( LXmlRow, LXmlTag, LXmlAttr );

    WriteLn( LXmlAttr.Values('x2') ); // => "500"

  finally
    LXmlAttr.Free;
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat