Xml in Pascal
program XMLExample;
uses
SysUtils, XMLDoc, XMLIntf;
type
TPlant = class
private
FId: Integer;
FName: string;
FOrigin: TStringList;
public
constructor Create;
destructor Destroy; override;
function ToString: string; override;
property Id: Integer read FId write FId;
property Name: string read FName write FName;
property Origin: TStringList read FOrigin;
end;
constructor TPlant.Create;
begin
inherited;
FOrigin := TStringList.Create;
end;
destructor TPlant.Destroy;
begin
FOrigin.Free;
inherited;
end;
function TPlant.ToString: string;
begin
Result := Format('Plant id=%d, name=%s, origin=%s',
[FId, FName, FOrigin.CommaText]);
end;
procedure MarshalXML(Plant: TPlant);
var
XMLDoc: IXMLDocument;
RootNode, OriginNode: IXMLNode;
i: Integer;
begin
XMLDoc := TXMLDocument.Create(nil);
XMLDoc.Active := True;
RootNode := XMLDoc.AddChild('plant');
RootNode.Attributes['id'] := Plant.Id;
RootNode.AddChild('name').Text := Plant.Name;
for i := 0 to Plant.Origin.Count - 1 do
begin
OriginNode := RootNode.AddChild('origin');
OriginNode.Text := Plant.Origin[i];
end;
WriteLn(XMLDoc.XML.Text);
end;
procedure UnmarshalXML(XMLString: string; var Plant: TPlant);
var
XMLDoc: IXMLDocument;
RootNode, OriginNode: IXMLNode;
i: Integer;
begin
XMLDoc := TXMLDocument.Create(nil);
XMLDoc.LoadFromXML(XMLString);
RootNode := XMLDoc.DocumentElement;
Plant.Id := StrToInt(RootNode.Attributes['id']);
Plant.Name := RootNode.ChildNodes.FindNode('name').Text;
Plant.Origin.Clear;
for i := 0 to RootNode.ChildNodes.Count - 1 do
begin
if RootNode.ChildNodes[i].NodeName = 'origin' then
Plant.Origin.Add(RootNode.ChildNodes[i].Text);
end;
end;
var
Coffee, Tomato: TPlant;
XMLString: string;
begin
Coffee := TPlant.Create;
try
Coffee.Id := 27;
Coffee.Name := 'Coffee';
Coffee.Origin.Add('Ethiopia');
Coffee.Origin.Add('Brazil');
MarshalXML(Coffee);
XMLString := '<?xml version="1.0"?>' + sLineBreak +
'<plant id="27">' + sLineBreak +
' <name>Coffee</name>' + sLineBreak +
' <origin>Ethiopia</origin>' + sLineBreak +
' <origin>Brazil</origin>' + sLineBreak +
'</plant>';
WriteLn(XMLString);
UnmarshalXML(XMLString, Coffee);
WriteLn(Coffee.ToString);
Tomato := TPlant.Create;
Tomato.Id := 81;
Tomato.Name := 'Tomato';
Tomato.Origin.Add('Mexico');
Tomato.Origin.Add('California');
// Nesting example is not directly translatable to Pascal
// as it doesn't have built-in support for nested XML structures
// You would need to implement custom logic for this
finally
Coffee.Free;
Tomato.Free;
end;
end.
This Pascal program demonstrates XML handling similar to the Go example. Here are some key points:
We use the
XMLDoc
andXMLIntf
units for XML processing in Pascal.The
TPlant
class represents the plant structure, similar to the Go struct.MarshalXML
function creates an XML representation of aTPlant
object.UnmarshalXML
function parses an XML string into aTPlant
object.The main program creates
Coffee
andTomato
plants, marshals and unmarshals XML.Pascal doesn’t have built-in support for XML tags in type definitions, so we manually create the XML structure.
The nested XML structure from the Go example is not directly translatable to Pascal. You would need to implement custom logic for nested structures.
Error handling is simplified in this example. In a real-world application, you should add proper error checking.
To run this program, you would typically save it as XMLExample.pas
and compile it using a Pascal compiler like Free Pascal or Delphi.
$ fpc XMLExample.pas
$ ./XMLExample
This will compile the program and run it, displaying the XML output and the parsed plant information.