<%
Dim strXML
strXML = "<xml>"
objRecordset.MoveFirst
Do While NOT objRecordset.EOF
strXML = strXML & "<row>"
strXML = strXML & "<ProductName>" _
& objRecordset.Fields.Item("ProductName").Value _
& "</ProductName>"
strXML = strXML & "<UnitPrice>" _
& objRecordset.Fields.Item("UnitPrice").Value _
& "</UnitPrice>"
strXML = strXML & "<UnitsInStock>" _
& objRecordset.Fields.Item("UnitsInStock").Value _
& "</UnitsInStock>"
strXML = strXML & "</row>"
objRecordset.MoveNext
Loop
strXML = strXML & "</xml>"
Set objRecordset = Nothing
%>
但是,以上两种方法最大的缺陷是不能够重用代码,我们把节点的名字都写死了,如果我们进行不同字段的查询,我们还必须手动更改我们的代码,以满足不同节点的需要。我们下面的方法将变得更加通用。
第三种方法:可重用的方法。
<%
Dim strXML
strXML = "<xml>"
objRecordset.MoveFirst
Do While NOT objRecordset.EOF
strXML = strXML & "<row>"
For Each varItem In objRecordset.Fields
strXML = strXML _
& "<" & varItem.name & ">" _
& varItem.value _
& "</" & varItem.name & ">"
Next
strXML = strXML & "</row>"
objRecordset.MoveNext
Loop
strXML = strXML & "</xml>"
Set objRecordset = Nothing
%>
一个更有效的方法,我们可以直接利用记录集内建的save方法,它能够自动地把记录集的内容转换成XML格式,我们调用save方法后,我们就可以立即释放内存中的记录集对象实例。 save方法有两个参数:一个是XML要保存的地方,一个是指示符,标明数据以何种格式保存。我们可以把数据保存成XML DOM对象(ADO STREAM对象),也可以直接保存成ASP RESPONSE对象,为通用起见,我们保存成XML DOM,第二个参数用adPersistXML ADO常量。方法如下:
<%
Const adPersistXML = 1
Dim objXMLDOM
Set objXMLDOM = Server.CreateObject("MSXML2.DOMDocument.3.0")
objRecordset.save objXMLDOM, adPersistXML
Set objRecordset = Nothing
%>
这种方法方便快捷,而且不容易出错,对不同的查询,也不用手动更改节点名字。但是,这种方法产生的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"
rs:CommandTimeout="30">
<s:AttributeType
name="ProductName"
rs:number="1"
rs:writeunknown="true">
<s:datatype
dt:type="string"
dt:maxLength="40"
rs:maybenull="false"/>
</s:AttributeType>
<s:AttributeType
name="UnitPrice"
rs:number="2"
rs:nullable="true"
rs:writeunknown="true">
<s:datatype
dt:type="number"
rs:dbtype="currency"
dt:maxLength="8"
rs:precision="19"
rs:fixedlength="true"/>
</s:AttributeType>
<s:AttributeType
name="UnitsInStock"
rs:number="3"
rs:nullable="true"
rs:writeunknown="true">
<s:datatype
dt:type="i2"
dt:maxLength="2"
rs:precision="5"
rs:fixedlength="true"/>
</s:AttributeType>
<s:extends type="rs:rowbase"/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row
ProductName="Chai"
UnitPrice="18"
UnitsInStock="39"/>
<z:row
ProductName="Konbu"
UnitPrice="6"
UnitsInStock="24"/>
<z:row
ProductName="Tofu"
UnitPrice="23.25"
UnitsInStock="35"/>
</rs:data>
</xml>