Loading search index…
No recent searches
No results for "Query here"
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 and XMLIntf units for XML processing in Pascal.
XMLDoc
XMLIntf
The TPlant class represents the plant structure, similar to the Go struct.
TPlant
MarshalXML function creates an XML representation of a TPlant object.
MarshalXML
UnmarshalXML function parses an XML string into a TPlant object.
UnmarshalXML
The main program creates Coffee and Tomato plants, marshals and unmarshals XML.
Coffee
Tomato
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.
XMLExample.pas
$ fpc XMLExample.pas $ ./XMLExample
This will compile the program and run it, displaying the XML output and the parsed plant information.