65.9K
CodeProject 正在变化。 阅读更多。
Home

将 INI 文件转换为 XML

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (21投票s)

2002年3月28日

CPOL

3分钟阅读

viewsIcon

306013

downloadIcon

2949

您可能需要将旧的 INI 文件转换为 XML。请继续阅读以获取解决方案。

这是什么?

您是否认为 XML 是一种比老式的 INI 文件更好的存储应用程序配置的方式?当然是。因此,您可能需要将 INI 文件转换为 XML。请继续阅读以获取解决此任务的方案。

我开始用 VB 6 编写应用程序,但是当我完成后,我想,为什么不在 VB.NET 和 C# 中也做一遍呢?因此,代码以这三种语言提供。

.NET 版本使用 .NET Frameworks 的 XmlTextWriter 类来编写 Xml 文件。这个类非常酷,因为它会处理转义任何特殊字符(例如 &、< 和 >),并且使编写 Xml 变得容易。

我该如何使用它?

  1. 添加对 INI2XML 程序集的引用。
  2. 添加 using LokiImports Loki 到代码顶部,因为它是在 Loki 命名空间中定义的。
  3. 然后调用 INI2XML 类中的函数 Convert。由于 Convert 函数是 static/Shared 的,因此您不需要创建该类的实例。

示例

C#

INI2XML.Convert( "C:\\WINNT\\iexplore.ini" );

VB.NET

INI2XML.Convert( "C:\WINNT\iexplore.ini" )

VB 6

Call INI2XML( "C:\WINNT\iexplore.ini", "" )

它将创建一个具有相同名称的 xml 文件,扩展名为 .xml,除非您将 xml 文件名作为第二个参数传递。

它是如何做到的?

从 INI 文件读取数据是通过两个巧妙的 WIN32 API 函数完成的。GetPrivateProfileSectionNames 获取 INI 文件中所有节的名称,GetPrivateProfileSection 获取单个节的所有设置。

使用这种方法意味着我不需要编写太多的解析代码来解释 INI 文件格式。

为了编写 XML 文件,我决定使用最简单的方法。在 VB 6 中,我使用了旧的 OpenPrintClose。在 VB.Net 和 C# 中,我使用了 .NET Framework 的 System.Xml.XmlTextWriter

基本上,代码如下所示

  1. 写入一个开头的根 XML 标签
  2. 使用 GetPrivateProfileSectionNames 获取所有节名称
  3. 对于每个节
    1. 为该节写入一个开头的 XML 节点
    2. 使用 GetPrivateProfileSection 获取该节中的所有设置
    3. 对于每个设置
      1. 为该设置写入一个 XML 节点
    4. 为该节写入一个结尾的 XML 标签
  4. 写入一个结尾的根 XML 标签

从转换后的 XML 读取值

有些人问我如何使用创建后的 xml 文件。因此,这是一个从 Xml 文件中读取两个值的示例。它获取 Internet Explorer 的主页和搜索页。

它基本上执行以下操作

  1. 将 xml 文件加载到 XmlDocument
  2. 使用 XPath 获取相应的节点
  3. 从节点 Attributes 集合中获取值

C# 示例

private string GetConfigValue( XmlDocument xmlDoc, string sectionName, 
    string settingName )
{
  string valueRet;

  // get setting node
  string xpath = 
    String.Format( "//section[@name='{0}']/setting[@name='{1}']", 
    sectionName, settingName );
  XmlNode node = xmlDoc.DocumentElement.SelectSingleNode( xpath );

  // display value
  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;
}

// Load configuration from xml file
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load( "C:\\WINNT\\iexplore.xml" );
string homePage = GetConfigValue( xmlDoc, "main", "Home Page" );
string searchPage = GetConfigValue( xmlDoc, "main", "Search Page" );

最后

请随意在您的项目中使用此代码,并根据您的具体要求对其进行修改。例如,您可能希望将 VB 6 代码放入 ActiveX DLL 中,或者您可能希望将源 INI 文件中的注释复制到目标 XML 文件中。

历史

  • 2007 年 1 月 30 日 - 更新下载
© . All rights reserved.