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
XMLDocandXMLIntfunits for XML processing in Pascal.The
TPlantclass represents the plant structure, similar to the Go struct.MarshalXMLfunction creates an XML representation of aTPlantobject.UnmarshalXMLfunction parses an XML string into aTPlantobject.The main program creates
CoffeeandTomatoplants, 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
$ ./XMLExampleThis will compile the program and run it, displaying the XML output and the parsed plant information.