Mirror

Convert an INI file to XML (Views: 101)


Problem/Question/Abstract:

INI was the old way to store settings (outside the registry), now everything is XML. This routine will convert an INI file into an XML node of a document.

Answer:

An XML node is part of an XML Document.  So if you have a new XMLDocument then just add a single node (AddChild) and that is the DocumentNode, then you could pass the DocumentNode to this routine.  If you pass in different Nodes then you could store multiple INI files in the same XML document, even if they have section and value name collisions.  The AsAttributes parameter determines if the values are stored as Attributes (default) or sub-nodes.  

uses XMLIntf, XMLDoc, INIFiles;

procedure INI2XML(const pINIFileName: string; const pXML: IXMLNode;
  const AsAttributes: Boolean = true);
var
  lINIFile: TIniFile;
  lSections, lItems: TStringList;
  iSections, iItems: integer;
  lNode: IXMLNode;
begin
  lINIFile := TIniFile.Create(pINIFileName);
  try
    lSections := TStringList.Create;
    try
      lItems := TStringList.Create;
      try

        lINIFile.ReadSections(lSections);

        for iSections := 0 to pred(lSections.Count) do
        begin
          lItems.Clear;
          lINIFile.ReadSection(lSections[iSections], lItems);
          lNode := pXML.AddChild(StringReplace(lSections[iSections], ' ', '',
            [rfReplaceAll]));
          for iItems := 0 to pred(lItems.Count) do
          begin
            if AsAttributes then
              lNode.Attributes[lItems[iItems]] :=
                lINIFile.ReadString(lSections[iSections], lItems[iItems], '')
            else
              lNode.AddChild(lItems[iItems]).Text :=
                lINIFile.ReadString(lSections[iSections], lItems[iItems], '');
          end;
          lNode := nil;
        end;

      finally lItems.Free;
      end;
    finally lSections.Free;
    end;
  finally lINIFile.Free;
  end;
end;

<< Back to main page