如何用ASP操作XML(二)

本文介绍了使用ASP将数据库记录集转换为XML格式的几种方法,包括手动构建XML字符串及利用Recordset对象的Save方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二个办法,遍历记录集,直接生成XML字符串本身:

  <%
  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>

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值