在传统的Windows应用开发中,ADO记录集是常用的数据存取对象,而XML是跨平台数据交换的主流格式,通过XSLT将ADO记录集转换为XML,可以实现不同系统间的数据互通。这种转换方式不需要手动拼接XML字符串,能够减少格式错误,提升开发效率。

核心概念说明
ADO记录集是ActiveX Data Objects中的核心对象,用于存储从数据库查询得到的结果集合,包含多条记录和对应的字段信息。XSLT即可扩展样式表语言转换,是一种用于将一个XML文档转换为另一个XML文档或其他格式的语言,通过定义转换规则实现数据结构的映射。
转换的基本思路是先将ADO记录集转换为临时的XML结构,再编写XSLT模板定义目标XML的格式,最后通过XSLT处理器执行转换,得到最终的XML结果。
转换步骤详解
第一步:生成ADO记录集的临时XML
ADO记录集本身提供了Save方法,可以将记录集保存为XML格式,这是转换的基础。以下是通过VBScript生成临时XML的示例:
' 创建ADO连接对象
Set conn = CreateObject("ADODB.Connection")
' 设置连接字符串,这里以Access数据库为例
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:test.mdb;"
conn.Open
' 创建ADO记录集对象
Set rs = CreateObject("ADODB.Recordset")
' 执行查询语句获取记录集
rs.Open "SELECT id, name, age FROM user_info", conn
' 将记录集保存为临时XML文件
rs.Save "D:temp_ado.xml", 1 ' 1表示保存为XML格式
' 释放对象
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
生成的临时XML结构大致如下,我们需要将这种结构转换为自定义的目标XML:
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <s:Schema id="RowsetSchema"> <s:ElementType name="row" content="eltOnly"> <s:AttributeType name="id" rs:number="1" rs:nullable="true" rs:write="true"> <s:datatype dt:type="int" dt:maxLength="4" rs:precision="10" rs:fixedlength="true"/> </s:AttributeType> <s:AttributeType name="name" rs:number="2" rs:nullable="true" rs:write="true"> <s:datatype dt:type="string" dt:maxLength="255"/> </s:AttributeType> <s:AttributeType name="age" rs:number="3" rs:nullable="true" rs:write="true"> <s:datatype dt:type="int" dt:maxLength="4" rs:precision="10" rs:fixedlength="true"/> </s:AttributeType> </s:ElementType> </s:Schema> <rs:data> <z:row id="1" name="张三" age="25"/> <z:row id="2" name="李四" age="28"/> </rs:data> </xml>
第二步:编写XSLT转换模板
我们需要编写XSLT模板,定义目标XML的结构,将临时XML中的记录映射到目标节点。以下是一个自定义用户列表XML的XSLT示例:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <!-- 输出格式为XML,编码UTF-8 --> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <!-- 匹配根节点 --> <xsl:template match="/"> <user_list> <!-- 遍历所有z:row节点,即ADO记录集的每条记录 --> <xsl:for-each select="//z:row"> <user> <user_id><xsl:value-of select="@id"/></user_id> <user_name><xsl:value-of select="@name"/></user_name> <user_age><xsl:value-of select="@age"/></user_age> </user> </xsl:for-each> </user_list> </xsl:template> </xsl:stylesheet>
第三步:执行XSLT转换
可以使用MSXML组件执行XSLT转换,将临时XML和XSLT模板结合,生成最终的目标XML。以下是VBScript执行转换的示例:
' 创建DOMDocument对象加载临时XML
Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.async = False
xmlDoc.load "D:temp_ado.xml"
' 创建DOMDocument对象加载XSLT模板
Set xslDoc = CreateObject("MSXML2.DOMDocument")
xslDoc.async = False
xslDoc.load "D:transform.xslt"
' 执行转换并保存结果
Set resultDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.transformNodeToObject xslDoc, resultDoc
resultDoc.save "D:result.xml"
' 释放对象
Set xmlDoc = Nothing
Set xslDoc = Nothing
Set resultDoc = Nothing
转换后得到的目标XML结构如下:
<?xml version="1.0" encoding="UTF-8"?> <user_list> <user> <user_id>1</user_id> <user_name>张三</user_name> <user_age>25</user_age> </user> <user> <user_id>2</user_id> <user_name>李四</user_name> <user_age>28</user_age> </user> </user_list>
注意事项
- ADO记录集的
Save方法生成的XML包含微软自定义的命名空间,编写XSLT时需要正确声明这些命名空间,否则无法正确匹配节点。 - 如果记录集包含特殊字符,比如字段值中有
<、>等,XSLT转换时会自动进行转义,不需要手动处理。 - 转换前需要确保临时XML和XSLT模板的路径正确,并且当前用户有对应文件的读写权限。
- 如果记录集数据量较大,建议分批次处理,避免内存占用过高。
常见问题解答
转换后XML节点为空怎么办
通常是XSLT模板中的节点匹配路径错误,需要检查临时XML的实际结构,确认z:row节点的路径是否正确,以及字段属性名是否和临时XML中的属性名一致。
支持哪些ADO记录集类型
只要是通过ADO查询得到的标准记录集,都可以使用这种方法转换,包括连接数据库查询得到的记录集、手动构造的记录集等。