What is it?
Do you think XML is a better way of storing an application's configuration than old fashioned INI files? Of course it is. So you probably need to convert your INI files into XML. Read on for a solution to just this task.
I started writing the app in VB 6, but when I finished I thought, why not do it in VB.NET and C# as well, so the code is provided in these three languages.
The .NET versions use the .NET Frameworks XmlTextWriter
class to write the Xml file. This class is very cool, as it will handle escaping any special characters for you (like &, < and >), and just makes writing Xml easy.
How do I use it?
- Add a reference to the
INI2XML
assembly.
- Add
using Loki
or Imports Loki
add the top of your code, as it's defined in the Loki namespace.
- Then call the function
Convert
in the INI2XML
class. As the Convert
function is static/Shared, you don't need to create an instance of the class.
Examples
C#
INI2XML.Convert( "C:\\WINNT\\iexplore.ini" );
VB.NET
INI2XML.Convert( "C:\WINNT\iexplore.ini" )
VB 6
Call INI2XML( "C:\WINNT\iexplore.ini", "" )
It will create an xml file of the same name, with a .xml extension unless you pass the xml file name as the second parameter.
How does it do it?
The reading of the data from the INI files is done by two nifty WIN32 API functions. GetPrivateProfileSectionNames
gets the names of all the sections in the INI file, and GetPrivateProfileSection
gets all the settings for an individual section.
Using this approach meant I didn't have to write much parsing code to interpret the INI file format.
To write the XML file I decided to use the simplest method available. In VB 6 I used good old Open
, Print
and Close
. In VB.Net and C#, I used the .NET Framework's System.Xml.XmlTextWriter
Basically the code goes something like this:
- Write an opening root XML tag
- Get all the section names using
GetPrivateProfileSectionNames
- For each section
- Write an opening XML node for the section
- Get all the settings in the section using
GetPrivateProfileSection
- For each setting
- Write an XML node for the setting
- Write a closing XML tag for the section
- Write a closing root XML tag
Reading Values from the Converted XML
Some people have asked me how to use the xml file once its created. So heres an example of reading two values from the Xml file. It gets the Home Page and Search Page for Internet Explorer.
It basically does the following:
- loads the xml file into a
XmlDocument
- uses
XPath
to get the appropriate node
- gets the value from the node Attributes collection
C# Example
private string GetConfigValue( XmlDocument xmlDoc, string sectionName,
string settingName )
{
string valueRet;
string xpath =
String.Format( "//section[@name='{0}']/setting[@name='{1}']",
sectionName, settingName );
XmlNode node = xmlDoc.DocumentElement.SelectSingleNode( xpath );
if ( node == null )
{
throw new Exception(
String.Format(
"No such setting, using the following xpath:{0}{1}",
Environment.NewLine, xpath ) );
}
else
{
XmlAttribute xmlAttr = node.Attributes["value"];
if ( xmlAttr == null )
{
throw new Exception( String.Format(
"No value for this setting, using the following xpath:{0}{1}",
Environment.NewLine, xpath ) );
}
else
{
valueRet = xmlAttr.Value;
}
}
return valueRet;
}
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load( "C:\\WINNT\\iexplore.xml" );
string homePage = GetConfigValue( xmlDoc, "main", "Home Page" );
string searchPage = GetConfigValue( xmlDoc, "main", "Search Page" );
Finally
Feel free to use this code in your projects, and modify it for your specific requirements. For example, you may want to put the VB 6 code into an ActiveX DLL, or you may want to copy the comments from the source INI file into the destination XML file.
History
- 30 Jan 2007 - updated download