with Ada.Strings.Unbounded;
package XML is
type Attribute is limited private;
type Element is limited private;
function Create (Name, Value : String) return Element;
function Create (Name, Value : String) return Attribute;
procedure Add_Child (To : in Element; Item : in Element);
procedure Add_Sibling (To : in Element; Item : in Element);
procedure Add_Attr (To : in Element; Item : in Attribute);
private
type Attribute_Type;
type Attribute is access Attribute_Type;
type Attribute_Type is
record
Name, Value : Ada.Strings.Unbounded.Unbounded_String := Ada.Strings.Unbounded.Null_Unbounded_String;
Next : Attribute := null;
end record;
type Element_Type;
type Element is access Element_Type;
type Element_Type is
record
Name, Value : Ada.Strings.Unbounded.Unbounded_String := Ada.Strings.Unbounded.Null_Unbounded_String;
Attr : Attribute := null;
Next, Child : Element := null;
end record;
end XML;
with Ada.Strings.Unbounded;
package body XML is
function "+" (Source : String) return Ada.Strings.Unbounded.Unbounded_String
renames Ada.Strings.Unbounded.To_Unbounded_String;
function Create (Name, Value : String) return Element is
New_Element : Element := new Element_Type;
begin
New_Element.Name := +Name;
if Value /= "" then
New_Element.Value := +Value;
end if;
return New_Element;
end Create;
function Create (Name, Value : String) return Attribute is
New_Attribute : Attribute := new Attribute_Type;
begin
New_Attribute.Name := +Name;
New_Attribute.Value := +Value;
return New_Attribute;
end Create;
procedure Add_Sibling (To : in Element; Item : in Element) is
begin
if To.Next = null then
To.Next := Item;
else
Add_Sibling (To => To.Next, Item => Item);
end if;
end Add_Sibling;
procedure Add_Child (To : in Element; Item : in Element) is
begin
if To.Child = null then
To.Child := Item;
else
Add_Sibling (To => To.Child, Item => Item);
end if;
end Add_Child;
procedure Add_Attr (To : in Attribute; Item : in Attribute) is
begin
if To.Next = null then
To.Next := Item;
else
Add_Attr (To => To.Next, Item => Item);
end if;
end Add_Attr;
procedure Add_Attr (To : in Element; Item : in Attribute) is
begin
if To.Attr = null then
To.Attr := Item;
else
Add_Attr (To => To.Attr, Item => Item);
end if;
end Add_Attr;
end XML;