利用XSLT把ADO记录集转换成XML

使用谷歌浏览器调试web前端鼓捣记 前端调试代码最常用的应该就是浏览器的debug了吧,也就是浏览器调试工具。那么我就以谷歌调试百度首页为例来看看吧。 调试工具的简单介绍: 打开谷歌的调试工具我比较习惯的用法是:右击页面----->检查 打开之后是这个样子: 首先,看一下功能菜单: 依次从左往右来看: 1.箭头按钮 用于在页面选择一个元素来查看他的相关信息。首先点击箭头按钮,然后在页面中找到要查看的元素点击。 2.设备图... 阅读详情
由于XML(可扩展标记语言:eXtensible Markup Language)真正的平台无关性,它正在逐渐成为数据传输的主要介质。XML是一种自描述的语言,数据本身就已经包含了元数据,即关于数据本身的信息。例如:“孟子E章1757281793923net_lover1807581793923”这组数据,从字面很难看出它代表什么意思,也不清楚它有几个数据段组成,但是,如果用XML来做如下的描述,我们就可以清楚地看到每个数据段所代表的含义:
 
 <PersonData>
  <Person>
   <姓名>孟子E章</姓名>
   <身高>175</身高>
   <体重>72</体重>
   <电话>81793923</电话>
  </Person>  
  <Person>
   <姓名>net_lover</姓名>
   <身高>180</身高>
   <体重>75</体重>
   <电话>81793923</电话>
  </Person>
 </PersonData>
 
 从上面的一段XML中,我们不但可以清楚地看到每一个数据代表的是什么意思了,而且还可以知道数据的分割位置。在我们平常的应用中,我们得到的结果可能是数组、集合或记录集的表现形式,我们该如何把它们转换成自描述的XML格式的数据呢?从数据形式上看,XML是简单的纯字符串的文本格式,字符串在传递时是非常简单、快速而且是容易的,数组在通过引用进行传递时有时是很慢的,而且处理起来很麻烦,而集合和记录集都是对象,在处理时会导致计算机性能的下降,并且这些对象都是与特定的平台相关联的,这就要求平台有内建的处理机制来处理对象的操作。XML已经是W3C的标准,是平台无关的,我们的计算机的唯一要求就是能够处理简单的XML字符串,即XML解析器,它能够解析XML字符串,能够通过一种接口很容易地把数据分解成一个个独立的数据段,以便我们能够进行访问。XML解析器都很小,性能也很好,在每种平台上都可以找到。一旦我们接收到XML数据并把它解析成上面的例子的样式后,我们就可以通过XSLT(eXstensible Stylesheet Language Transformations)把他们转换成不同的表现形式。利用XML的数据格式进行数据传输,将会使我们编写应用程序代码的工作更简单轻松,而且具有良好的可伸缩性。
 下面,我们就看看如何来转换我们的数据。我们的例子是在Microsoft Windows 2000,IIS5,MSXML3和ADO2.6下编写的,样例数据采用Microsoft SQL Server7.0自带的Northwind示例数据库。之所以采用SQL Server7而不采用支持XML的SQL Server2000,是考虑到通用性的原则,我们的目的是:处理不同类型的数据源得到的记录集,而不仅仅是象SQL Server2000那样的支持XML输出的数据源。使用ADO,是因为它形式多样,可以处理不同类型的数据源;使用XML,是因为它能够快速传输和解析。但本例的处理方法也适合在任何具有Micrsoft XML解析器,ADO2.5或以上版本的Windows,IIS,SQL Server的环境中。
 为简单起见,我们仅选择单价小于等于20美圆,库存大于等于20,产品名称小于等于6个字符的产品:
 
  <%
  Dim objRecordset
  Set objRecordset = Server.CreateObject("ADODB.Recordset")
  objRecordset.open _
      "SELECT ProductName, UnitPrice, UnitsInStock " _
          & "FROM Products " _
          & "WHERE UnitPrice <= 20 " _
          & "AND UnitsInStock >= 20 " _
          & "AND LEN(ProductName) <= 6 " _
          & "ORDER BY ProductName", _
      "Provider=SQLOLEDB;" _
          & "Data Source=SomeSQLServer;" _
          & "Initial Catalog=Northwind;" _
          & "User ID=MyUserName;" _
          & "Password=MyPassword;"
  %>
 现在,我们就用3种方式把我们得到的记录集转换成XML格式。
 首先,我们可以遍历整个记录集,采用XML DOM(Document Object Model),建立XML节点树:

  <%
  Dim objXMLDOM, objRootNode, objNode
  Set objXMLDOM = Server.CreateObject("MSXML2.DOMDocument")
  
  Set objRootNode = objXMLDOM.createElement("xml")
  objXMLDOM.documentElement = objRootNode
  
  Do While NOT objRecordset.EOF
      Set objRowNode = objXMLDOM.createElement("row")  
      Set objNode = objXMLDOM.createElement("ProductName")
      objNode.text = objRecordset.Fields.Item("ProductName").value
      objRowNode.appendChild(objNode)
  
      Set objNode = objXMLDOM.createElement("UnitPrice")
      objNode.text = objRecordset.Fields.Item("UnitPrice").value
      objRowNode.appendChild(objNode)
  
      Set objNode = objXMLDOM.createElement("UnitsInStock")
      objNode.text = objRecordset.Fields.Item("UnitsInStock").value
      objRowNode.appendChild(objNode)
  
      objRootNode.appendChild(objRowNode)
  
      objRecordset.MoveNext
  Loop
  
  Set objNode = Nothing
  Set objRowNode = Nothing
  Set objRootNode = Nothing
  
  Set objRecordset = Nothing
  %>

 现在,我们就得到了一个XML DOM对象。这种方法对于记录集很大时性能并不理想,因为系统内存中要同时保存ADO记录集对象和XML DOM对象。
 第二个办法,遍历记录集,直接生成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>

 ADO自动产生的XML包含了schema信息,它描述这个XML里允许有什么节点和属性以及采用何种数据类型,而且数据节点也增加了名称空间。schema信息在需要数据验证的地方或进行更复杂的处理或许很有用,但是,大多数情况下,我们使用的是瘦客户机,我们不需要schema信息。我们可以利用XSLT来分离出我们想要的信息,去掉多余的信息。因此,我们编写下面的“ DataCleaner.xsl”:

  <?xml version="1.0"?>
  <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      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">
  
  <xsl:output omit-xml-declaration="yes"/>
  <xsl:template match="/">
      <xsl:element name="xml">
          <xsl:for-each select="/xml/rs:data/z:row">
              <xsl:element name="row">
                  <xsl:for-each select="@*">
                      <xsl:element name="{name()}">
                          <xsl:value-of select="."/>
                      </xsl:element>
                  </xsl:for-each>
              </xsl:element>
          </xsl:for-each>
      </xsl:element>
  </xsl:template>
  
  </xsl:stylesheet>
  
 这个XSLT具有可重用的特性,对于不同的查询结果都适用,下面就是如何使用这个XSLT的例子:
 
  <%
  Dim strCleanXML, objXMLDOM_XSLT
  
  Set objXMLDOM_XSLT = CreateObject("MSXML2.DOMDocument")
  objXMLDOM_XSLT.load(Server.MapPath("DataCleaner.xsl"))
  strCleanXML = objXMLDOM.transformNode(objXMLDOM_XSLT)
  
  Set objXMLDOM = Nothing
  Set objXMLDOM_XSLT = Nothing
  %>
  
 经过上面的处理以后,strClaenXML就是我们所想要的XML字符串了。
   
  <xml>
      <row>
          <ProductName>Chai</ProductName>
          <UnitPrice>18</UnitPrice>
          <UnitsInStock>39</UnitsInStock>
      </row>
      <row>
          <ProductName>Konbu</ProductName>
          <UnitPrice>6</UnitPrice>
          <UnitsInStock>24</UnitsInStock>
      </row>
  </xml>
  
 上面这种格式的XML字符串是我们经常见到的节点集的样式,如果您不想把字段处理成节点,而把它处理成属性节点,那么我们只需对DataCleaber.xsl稍加改动即可:

  <?xml version="1.0"?>
  <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      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">
  
  <xsl:output omit-xml-declaration="yes"/>
  
  <xsl:template match="/">
      <xsl:element name="xml">
          <xsl:for-each select="/xml/rs:data/z:row">
              <xsl:element name="row">
                  <xsl:for-each select="@*">
                      <xsl:attribute name="{name()}">
                          <xsl:value-of select="."/>
                      </xsl:attribute>
                  </xsl:for-each>
              </xsl:element>
          </xsl:for-each>
      </xsl:element>
  </xsl:template>
  
  </xsl:stylesheet>

 以下是采用了新样式的结果,它比用节点表示字段的长度要短的多了。传输起来速度会更快:
 
  <xml>
   <row ProductName="Chai" UnitPrice="18" UnitsInStock="39"/>
   <row ProductName="Konbu" UnitPrice="6" UnitsInStock="24"/>
  </xml>
  
 到此为止,我们介绍了从ADO 记录集得到XML格式数据的几种办法,也得到了最简化的字符串。但是有几个问题你仍然需要注意,有些字段值还有XML里不支持的字符,比如:"'<>&,象P&G宝洁公司的名称,Chef Anton's Gumbo Mix产品名字等,在做转换时要进行编码处理。在Microsoft ADO 2.6的SDK里有使用save方法时要注意的问题:1,save方法只对open Recordset起作用;2,不支持带有adVariant,adIDispatch,adIUnknown类型的字段的记录集的savw;3,当保存分级的记录集( data shapes)有两个限制:不能保存参数化和含有未解决的更新的记录集。
 为了更进一步提高性能,你可以把转换工作放到COM/COM+组件中, ASP代码只进行数据的最终表现即可。把业务层、数据层和表现层分开,ASP只需要调用数据组件,数据组件调用数据库的存储过程,把结果转换成XML,最后只把简单的XML字符环串回到ASP程序里,ASP就可以用XSLT把XML进行转换,把结果送到浏览器。

谷歌浏览器开发者工具操作手册 谷歌浏览器开发者工具操作手册:谷歌浏览器是开发人员使用最多的,作为前端开发来说:掌握谷歌浏览器的开发者工具调试的各种功能可以更快的定位到问题,更好与后端做交互。 阅读详情

相关推荐

JS获取本地IP&显示隐藏IP

JS获取本地IP&显示隐藏IP前言JS获取本地IP方法遇到问题解决方案火狐(FireFox)删除隐藏IP谷歌(Chrome)删除隐藏IP 前言 这段时间一直在搞前端,我一个软件开发工程师开发前端得多闲.项目需求需要获取当前机器IP,所以从网上搜索一堆代码摘除来加到项目中,其中遇到的问题在下面已经加上了,方便回顾. JS获取本地IP方法 代码如下: function getUserIP(on...

ROS小生的博客 2858

xmlADO的结合

1,xml基础XML的一种可扩展的标记语言,version:文档符合xml1.0规范,encoding:文档字符编辑, standalone:文档定义是否在一个文件内。DocumentSource属性:使用字符串来设置xml文档,该属性通常是以声明方式设置,具体方法 是在xml控件的<asp:Xml>标记的开始和结束之间放置文本。TransformSource...

weixin_34221775的博客 226

SIwave仿真手册——信号完整性仿真之S参数的提取(二)

上一篇简单了讲述了软件的各个操作界面,本次博客更新关于的仿真,因为第二章完整的内容比较多,所以分成好几篇博客进行分享。

luohuo9844的博客 1万+

ADO数据与XML数据间的转换的类

 当对现有数据库的数据进行分析时,经常需要对某一部分的数据进行分析.此时,使用1.SQL查询分析器?但其往往不直观,查找某个关键字又需要重新执行新的SQL.2.SQLXML模板?但又不一定有权限建立新的虚拟目录,且某些SQL语句SQLXML模板不支持 数据拆离时也有相似问题。尤其当不同网络,不同环境,需要重新导入数据,进行分析或拆离,困难尤为明显。能不能有一种方法,可以将数据脱离于数据库进

loyos的专栏 1049

vb 读取记录集文件

问题: 如何导入用ADODB.Recordset.Save保存的XML文件到新的Recordset?《ADO/DAO/ADO.NET》 我用了上述方法保存了 XML ,但是格式好怪呀: &lt;xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-...

泰瑞的博客 905

如何用ASP操作XML(三)

   ADO自动产生的XML包含了schema信息,它描述这个XML里允许有什么节点和属性以及采用何种数据类型,而且数据节点也增加了名称空间。schema信息在需要数据验证的地方或进行更复杂的处理或许很有用,但是,大多数情况下,我们使用的是瘦客户机,我们不需要schema信息。我们可以利用XSLT来分离出我们想要的信息,去掉多余的信息。因此,我们编写下面的“ DataCleaner.xsl:

xushen8314的专栏 988

js获取系统当前时间

利用js获取系统当前时间,有很多种获取方法,这里只列举其中一种比较简单的写法,适合新手参考。 示例代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js获取系统当前时间</title> </head...

程序羊的博客 1682

【BS 总结】谷歌浏览器怎么调试JS

 转载至 https://www.cnblogs.com/hongmaju/p/5115801.html 谷歌浏览器怎么调试js 首先我们打开开发者工具,你可以直接在页面上点击右键,然后选择审查元素或者在Chrome的工具中找到或者你直接记住这个快捷方式: Ctrl+Shift+I (或者Ctrl+Shift+J直接打开控制台),或者直接按F121、Elements标签页 这个就是...

吴佳莹 978

不得不说的谷歌开发者模式:谷歌调试模式调试js代码总结

谷歌浏览器对开发者来说是一个很好的工具,确实能给开发者提供很多的方便,这是工作一年多以来,一个感触。谷歌浏览器可以在前端跟踪值传递,就像我们使用myeclipse进行debug一样,谷歌浏览器提供了强大的功能,使得开发者可以在前端跟踪值传递。 只要安装了谷歌浏览器,我们就可以使用谷歌开发者模式进行代码的调试,按F12进入开发者模式。 1,首先我们来说一下谷歌浏览器的控制台con

qq_23476319的博客 2876

谷歌怎么调试html,谷歌浏览器调试js的步骤_谷歌浏览器怎样调试javascript-win7之家...

对于一些开发人员可能经常要进行javascript调试,但是不同浏览器的调试方法可能不大一样,有用户在安装谷歌浏览器之后,想要调试javascript却不知道要怎么下手,为此,本文就给大家讲述一下谷歌浏览器调试js的步骤,感兴趣的一起随小编来看看详细内容吧。谷歌浏览器稳定版下载 chrome谷歌浏览器官方稳定版这款chrome谷歌浏览器官方稳定版是一款基于JavaScript V8引擎的快速、安全...

weixin_31236935的博客 962

谷歌浏览器开发者模式

       一般在windows系统上浏览器开发者工具打开都是按F12快捷键,按F12快捷键打开谷歌浏览器如下图所示,下面来分别解释一下各个功能 一、第一个功能:定位的作用,点击一下这个图标,将鼠标放在任意页面上的位置,就可以查看到右边的源码     二、第二个功能:是用于屏幕适配的,也就是说谷歌浏览器可以模拟各个型号的手机打开wap页面,如果需要增加手机型号,点击下拉菜单的Ed...

馨若梦的博客 2万+

谷歌浏览器怎么调试js

谷歌浏览器怎么调试js 一、总结 一句话总结:chrome里面功能比较强大,功能也很多,多点点就好,遇到问题的时候多尝试就好, 多 尝试   1、对某个元素进行监听,在JS对元素的属性或者HTML进行修改的时候,直接触发断点,跳转到对改元素进行修改的JS代码处? html break on   2、查看到存储相关的如Cookies、HTML5的Database和LocalSto...

weixin_34092455的博客 4226

谷歌(chrome)恐龙小游戏外挂

你是不是也遇到过上面这种情况? 然后按下空格键就可以开始游戏 然而,每次游戏失败都会从原点开始,速度放慢再来, 那么,有没有什么方法可以让我们不再从原速度开始呢? 有,在线开挂 谷歌这款掉线后出现的小游戏的代码是由前端js写成的,其编程思想以对象为主,我们主要找这个文件: 往下找,直到这几行代码: 无视障碍物,刷分可以刷到爆: 那就在控制台输入这条语句> Runner.instance...

数据库爆破专家的博客 1万+

谷歌浏览器开发者工具的使用详解

一、基础功能篇 1. elements 在elements中主要分为两大块: A:HTML结构面板 B:操作dom样式、结构、事件的显示面板 (1)点击箭头选中一个元素,可以在HTML面板中定位到该元素,并且可以在右侧styles面板中查看和编辑该元素的样式,编辑时,效果可以实时更新,这对于前端工程师解决样式问题是个大大的福利,在HTML面板中ctrl+F,可以对html中的内容进行搜索。 (2)在右侧Computed面板中,可以查看对应元素的盒图和该元素上最终生效的样式(包含继承父级元素的样式和自己的样

Flowering_Vivian的博客 4410

js 判断浏览器能否后退_5分钟帮你了解一下谷歌浏览器的架构

chrome 在从事前端开发过程中,浏览器作为最重要的开发环境,浏览器基础是前端开发人员必须掌握的基础知识点,它贯穿着前端的整个网络体系。对浏览器原理的了解,也可以提高编写前端代码性能的上限。如果你是web前端开发人员那就来一起学习下谷歌浏览器的架构知识吧。谷歌浏览器运行的时候会启动四个主要进程:浏览器进程、GPU进程、第三方插件进程及渲染进程。下面来一一介绍下四个主要进程的作用。1.浏览器进程C...

weixin_42134554的博客 367

【实用工具】谷歌浏览器插件开发指南

本指南主要是对Chrome插件的官方开发文档做了翻译、理解和实践,只适合小白学习。如果你已经掌握了Chrome插件的开发,那么该指南便没有阅读的意义;再如果你在插件开发过程中遇到了疑难杂症,那么该指南也无法为你提供解答方案和思路。

wenchun001的博客 8844

谷歌浏览器调试javascript教程

注:原文转载自http://www.pc6.com/infoview/Article_73162.html 谷歌浏览器是一款由谷歌公司开发的浏览器。谷歌浏览器是一款基于其他开源软件所撰写的。下面小编为大家分享一篇谷歌浏览器调试javascript的教程,希望帮助大家 首先我们打开开发者工具,你可以直接在页面上点击右键,然后选择审查元素或者在Chrome的工具中找到或者你直接记住这个快捷方式: ...

Sp4rkW的博客 1176

线程池详解(通俗易懂超级好)

目标 【理解】线程池基本概念 【理解】线程池工作原理 【掌握】自定义线程池 【应用】java内置线程池 【应用】使用java内置线程池完成综合案例 线程池 线程池基础 线程池使用 线程池综合案例 4.学员练习 5.线程池总结 概念介绍 1:什么是线程池 2:为什么使用线程池 3:线程池有哪些优势 什么是池 什么是线程池 线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runna.

拉格朗日的学习笔记 12万+

metatrader5(MT5)最新安装文件

metatrader5(MT5)最新安装文件

上一篇: 使用.NET存储XML数据
下一篇: C# 实现网段扫描
slightboy
博客等级 码龄23年 3粉丝 18原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值