HSG

Aktuelle Seite: HSG/Fächer/Informatik/Theorie/Sprachen/xml

Achtung: Die Inhalte dieser Seite sind experimentell!

Installation der openxml-Klassen

Zitat auf der openxml Seite:

Open XML is a collection of XML and Unicode tools and components for the Delphi/Kylix™ programming language. All packages are freely available including source code.

Die benötigten Klassen findet man in utils_2_0.zip und in xdom4_1.zip. Nach dem Auspacken entstehen die Verzeichnisse Utilities und Xdom_4_1. Wie weiter unten angeführt empfiehlt es sich, die Units aus Utilities und die Unit Xdom_4_1.pas aus Xdom_4_1 in das Projekt einzufügen.

Zugriff auf DOM-Knoten

Ziel ist es, zunächst ein möglichst einfaches Programm anzugeben, das einen Zugriff auf Knoten eine DOM-Baumes erlaubt.

grammar.xml, grammar.dtd

program Parse1;

uses
  Forms,
  uParse1 in 'uParse1.pas' {Form1},
  Xdom_4_1 in '..\..\Xdom_4_1\Xdom_4_1.pas',
  XmlRulesUtils in '..\..\Utilities\XmlRulesUtils.pas',
  AutoListUtils in '..\..\Utilities\AutoListUtils.pas',
  AutoStrCtrls in '..\..\Utilities\AutoStrCtrls.pas',
  cUnicodeCodecs in '..\..\Utilities\cUnicodeCodecs.pas',
  LangUtils in '..\..\Utilities\LangUtils.pas',
  MiscUtils in '..\..\Utilities\MiscUtils.pas',
  ParserUtils in '..\..\Utilities\ParserUtils.pas',
  TreeUtils in '..\..\Utilities\TreeUtils.pas',
  UnicodeUtils in '..\..\Utilities\UnicodeUtils.pas',
  UriUtils in '..\..\Utilities\UriUtils.pas',
  WideStringUtils in '..\..\Utilities\WideStringUtils.pas',
  AbnfUtils in '..\..\Utilities\AbnfUtils.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
unit uParse1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Xdom_4_1, StdCtrls;

type
  TForm1 = class(TForm)
    bLese: TButton;
    mAusgabe: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure bLeseClick(Sender: TObject);
  private
    dom : TDomImplementation;
    par : TXmlToDomParser;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // ein DomImplementation-Objekt wird in jedem Fall gebraucht, AOwner wird hier auf nil gesetzt
  dom := TDomImplementation.Create(nil);
  // ein Parserobjekt wird erzeugt
  par := TXmlToDomParser.Create(nil);
  // das Parserobjekt lernt das Implementationobjekt kennen
  par.DOMImpl := dom;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // wer selbst erzeugt, muss auch selbst vernichten
  par.Free;
  dom.Free;
end;

procedure TForm1.bLeseClick(Sender: TObject);
var
  node : TDomNode;  // node ist nur ein Zeiger
begin
  // ein DOM-Baum wird erzeugt und node zeigt auf die Wurzel
  node := par.ParseFile('grammar.xml',false);

  mAusgabe.Lines.Add(node.NodeName);
  // Zeiger wird weitergerĂĽckt
  node := node.FindFirstChildElement;
  // Achtung: FindFirstChildElement <> FirstChild
  mAusgabe.Lines.Add(node.NodeName);
  node := node.FindFirstChildElement;
  mAusgabe.Lines.Add(node.NodeName);
  node := node.FindNextSiblingElement;
  mAusgabe.Lines.Add(node.NodeName);
  node := node.FindFirstChildElement;
  mAusgabe.Lines.Add(node.NodeName);
  // statt ĂĽber einen Text-Knoten kommt man auch so an den Inhalt
  mAusgabe.Lines.Add(node.TextContent);
end;

end.

Kleiner DOM-Navigator

Navigator0 navigator0.zip

Ein einfacher DOM-Tree wird erzeugt und nach xml serialisiert

Ein altes Craig Murphy-Beispiel mit xdom_4_1

DOMTree

unit uDOMtree;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, XDOM_4_1, StdCtrls;

type
  TForm1 = class(TForm)
    bBaueauf: TButton;
    mAusgabe: TMemo;
    procedure bBaueaufClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    dom : TDomImplementation;
    par : TDomToXmlParser;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.bBaueaufClick(Sender: TObject);
var
  doc               : TDomDocument;
  element, element1 : TDomElement;
  textnode          : TDomText;
  hs                : string;
begin
  // erzeuge einen Wurzelknoten
  doc := TDomDocument.Create(dom);
  // erzeuge ein Element <richplum> im Baum 'doc'
  element := TDomElement.Create(doc,'richplum');
  // fĂĽge das Attribut display="true" dem document element hinzu
  element.SetAttribute('display','true');
  // hänge das Element an die Wurzel
  doc.AppendChild(element);
  // erzeuge ein Element <message>
  element1 := TDomElement.Create(doc,'message');
  // erzeuge einen Text-Knoten
  textnode := TDomText.Create(doc);
  // fĂĽlle den Textknoten mit Daten
  textnode.AppendData('hello, world');
  // hänge den Textknoten an das <message>-Element
  element1.AppendChild(textnode);
  // hänge das <message>-Element an das <richplum>-Element
  element.AppendChild(element1);
  // erzeuge aus dem Baum einen "XML-String"
  par.writeToString(doc,'',hs);
  // weise den String der Ausgabe zu
  mAusgabe.Lines.Text := hs;
  // lösche den document-Baum
  doc.clear;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  dom := TDomImplementation.create(nil);
  par := TDomToXmlParser.create(nil);
  par.DOMImpl := dom;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  par.Free;
  dom.Free;
end;

end.

jflap-Akzeptor

experimentell!

jflap-Akzeptor jflapAkzeptor.zip

jflap-Grammar

Grammar0 jflapGrammar.zip

Valid XHTML 1.0!