MicroXML (updated 07-FEB-2009)

MicroXML utilizes Stefan Heymann's XML parser to generate an XML DOM using Delphi classes.

Send comments/suggestions/jokes/complaints/ramblings to rmorales2005 at gmail.com.

Download

MicroXML.zip (does NOT include the parser)

Updated on 07-FEB-2009 to fix a simple bug with saving element attributes - thanks to Steffen Thorkildsen!

Download Stefan Heymann's XML parser and be sure to include both LibXmlParser.pas and MicroXml.pas in your project.

Compatibility

Tested with Turbo Delphi 2006, and FreePascal 2.2.0 (using -Mdelphi).

Documentation

MicroXML is very easy to use, as there's only three classes to learn:

TMicroXmlAttribute

This class is used to describe attributes found in an XML element.

Properties

Property Type Description
Name string The attribute's name.
Value string The attribute's value.

TMicroXmlElement

This is the most important class in MicroXML. TMicroXmlElement represents all elements in the XML document, starting from the root element.

Properties

Property Type Description
Parent TMicroXmlElement

Indicates the parent of this XML element.

For the root node, Parent is nil.

Name string The XML element's tag name.
Text string The text contents, if any, of the XML element.
Attributes Array Provides access to the XML element's attributes.
AttributeCount Integer Returns the number of attributes.
Children Array Provides access to children of this XML element.
ChildCount Integer Returns the number of children.

Methods

constructor Create(AParent: TMicroXmlElement; const AName: string);

Default constructor. Do not directly construct TMicroXmlElement objects yourself.

procedure SetAttribute(const Name, Value: string);

Assign the string in Value to the attribute Name. If the attribute does not exist, it will be created.

function GetAttribute(const Name: string): string;

Retrieve the value of an attribute by name. If the attribute does not exist, an empty string is returned.

function AddChild(const Name: string): TMicroXmlElement;

Add a new child element to this XML element. A TMicroXmlElement object is returned for your use.

procedure AddChildStrings(const Name: string; const Strings: TStrings);

Each string in Strings will be added as a child element, using the specified element name.

procedure DeleteChild(Index: Integer);

Remove a child element.

function IndexOf(const Element: string): Integer;

Locate a child element by name. A zero-based index is returned: 0 for the first element, 1 for the second, etc. If the element is not found, -1 is returned.

function GetChildText(const Element: string): string;

A convenience function to retrieve the text of a child XML element. If the element does not exist, an empty string is returned.

TMicroXmlDocument

This class loads XML documents and generates a DOM.

Properties

Property Type Description
RootElement TMicroXmlElement

The XML document's root element.

This will be nil until an XML document is loaded via LoadFromFile, or started via NewDocument.

Methods

procedure NewDocument(const RootElemName: string);

Sets up the TMicroXmlDocument object to start a new XML DOM. RootElemName is the name of the document's root element.

procedure LoadFromFile(const FileName: string);

Creates an XML DOM from the specified file. WARNING: TMicroXmlDocument only supports one root element. MicroXML's behavior is undefined for documents that have multiple root elements.

procedure SaveToFile(const FileName: string);

Save the XML DOM to the specified file.

Example #1 - Reading an XML file

This program will load a file called "test.xml" and print out its contents.

program xmltest;

uses
  SysUtils, Classes, MicroXml;

procedure PrintXmlElement(Element: TMicroXmlElement; const Level: Integer);
var
  Indent: string;
  Index: Integer;
begin
  Indent := StringOfChar(' ', Level * 2);
  WriteLn(Indent, '+ ', Element.Name);

  if Length(Element.Text) <> 0 then
    WriteLn(Indent, Indent, Element.Text);

  for Index := 0 to Pred(Element.AttributeCount) do
    WriteLn(Indent, Indent, Element.Attributes[Index].Name, ' = ', Element.Attributes[Index].Value);

  if (Element.ChildCount <> 0) then
  begin
    for Index := 0 to Pred(Element.ChildCount) do
      PrintXmlElement(Element.Children[Index], Level + 1);
  end;
end;

procedure PrintXmlFile;
var
  Doc: TMicroXmlDocument;
begin
  Doc := TMicroXmlDocument.Create;
  try
    Doc.LoadFromFile('test.xml');
    PrintXmlElement(Doc.RootElement, 0);
  finally
    Doc.Free;
  end;
end;

begin
  PrintXmlFile;
end.