sax、dom、pull解析xml

利用Dom,Sax,Pull三种方式解析xml文件 最近找工作,看到许多公司的要求里都写了要会xml解析,所以就把之前的xml解析知识又重新回顾了一下,写个小例子. 解析xml文件常用的几种方式也就dom,sax,pull了,并且面试官经常问到的也是这三种解析方式之间的优缺点以及使用情况,先说一下这三种方式的优缺点和使用情况吧: 其实dom,sax,pull之间的优缺点网上有很多,讲的搞不好比我的还要深入和贴切,不过还是要说一下,毕竟自己以后还 阅读详情

-------------------------------------SAX解析xml----------------------------------

》Sax定义

         SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于android等移动设备

         SAX全称是Simple API for Xml,既是指一种接口,也是一个软件包

         作为接口,sax是事件驱动型xml解析的一个标准接口

》Sax特点

        1. 解析效率高,占用内存少

        2.可以随时停止解析

        3.不能载入整个文档到内存

        4.不能写入xml

        5.SAX解析xml文件采用的是事件驱动

        ---sax并不需要解析完 整个文档,在按内容顺序解析文档的过程中,sax会判断当前读到的字符是否合法xml语法中的某部分,如果符合就会触发事件

》Sax工作原理

         Sax的工作原理简单的说,就是对文档进行顺序扫描,扫描到文档(document)开始与结束,扫描到元素(element)开始、结束等地方时调用事件处理

         处理函数做相应动作,然后继续扫描,直到文档结束。

》Sax解析文档过程

           1.继承DefaultHandler  ,并实现方法       

           2.创建SAX解析器工厂

           3.获得解析器

           4.获得输入流

           5.使用输入流,和实现接口作参数,调用解析器的解析方法进行解析


》defaultHandler 接口是实现contentHandler接口

         ContentHandler接口中的常用方法

                 >startDocument()

                            当遇到文档开头的时候,调用这个方法,可以在其中做一些与准备工作

                 >endDocument()

                             当文档结束的时候,调用这个方法,可以在其中做一些善后工作

                 >startElement(String namespaceURL, String localName, String qName, Attributes atts)

                             当读到一个开始标签的时候,会触发这个方法。namespaceURL就是命名空间,localName是不带命名空间前缀的标签名,

                             qName是待命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。

                 >endElement(String uri, String localName, String name)

                            当遇到结束标签的时候,调用这个方法

                  >characters(char[] ch, int start, int length)

                            这个方法用来处理在xml文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,

                            使用new String(ch, start, length)就可以获取内容


》SAX解析实例

          -------------1.在src下创建xml 文件,并结合成实体类Userinfo.java-------------

<?xml version="1.0" encoding="UTF-8"?>
<admins>
<admin id="1">
<name>阿龙</name>
<age>23</age>
<sex>男</sex>
<email>along@qq.com</email>
</admin>
</admins>


          ----------Userinfo.java----

        String name;
int age;
String sex;
String email;
String id;

      。。。  生成get、set方法

     --------------------2.创建XmlPaser继承defaultHandler----------------------

  public class XmlPaser extends DefaultHandler{

        //创建user对象为把查到的内容放到里面

        Userinfo user;
public Userinfo getUser() {
return user;
}
public void setUser(Userinfo user) {
this.user = user;
}

         //定义标签变量

        String tagName = null;

        //开始文档处理些准备工作

         public void startDocument() throws SAXException {
user = new Userinfo();
super.startDocument();
}

       

        //读到第一个标签触发

         public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tagName = localName;
if("admin".equals(tagName)){
user.setId(attributes.getValue(0));
System.out.println("id:  "+attributes.getValue(0));
}
}

        

       //读取文本内容

      public void characters(char[] ch, int start, int length)
throws SAXException {
if(tagName!=null){
if("name".equals(tagName)){
String str = new String(ch,start,length);
user.setName(str);
System.out.println("name:  "+str);
}else if("age".equals(tagName)){
String str = new String(ch,start,length);
user.setAge(Integer.parseInt(str));
System.out.println("age:   "+str);
}else if("sex".equals(tagName)){
String str = new String(ch,start,length);
user.setSex(str);
System.out.println("sex:  "+str);
}else if("email".equals(tagName)){
String str = new String(ch,start,length);
user.setEmail(str);
System.out.println("email:  "+str);
}
}
}

        //遇到结束标签

       public void endElement(String uri, String localName, String qName)
throws SAXException {
tagName=null;

}

        //文档读完

public void endDocument() throws SAXException {
super.endDocument();
}

 }


----------------布局文件main省略-----------

----------------------3.-类SAXActivity继承Activity----------------

         Button btnOk;

        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

btnOk = (Button)this.findViewById(R.id.button1);
        btnOk.setOnClickListener(new OnClickListener() {

public void onClick(View v){

//创建解析工厂和解析器

                        SAXParserFactory spf = SAXParserFactory.newInstance();

                        try{

SAXParser sp = spf.newSAXParser();

                                //解析

                               XmlPaser xp = new XmlPaser();

                                InputStream is = this.getClass().getClassLoader().getResourceAsStream("user.xml");

sp.parse(is,xp);

//获得读取到的内容

                                 Userinfo user = xp.getUser();

//在页面显示

.................

}

}

       });

     }


---------------------------------------Dom解析Xml--------------------------------------------

》DOM简介

        dom全称Document Object Model ,为xml文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个主流内存的树结构,

         然后代码就可以使用dom接口来操作这个树结构

》DOM的特点

         >优点

                  1.整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能

                  2.通过树形结构存取xml文档

                  3.可以在树的某个节点上向前或向后移动

           >缺点

                  1.将整个文档调入内存(包括无用的节点),浪费时间和空间

            >适用场合

                  一旦解析了文档还需多次访问这些数据;硬件资源充足(内存,cpu)

》DOM解析步骤

      1.创建解析器工厂

      2.获得解析器工厂

      3.接受一个xml文档作为输入参数名,并得到一个xml的文档对象(Document)

      4.操作文档对象


》解析实例:

-----------------------1.创建要解析的xml文件、和实体类(Person)---------------------------

<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1">
<name>Tom</name>
<age>19</age>
</user>
<user id="2">
<name>Jaary</name>
<age>18</age>
</user>
</users>


实体类 略

-----------------------2. Dom解析(DomService.java)-----------------------------------

public List<Person> getPersons(InputStream input) throws Throwable{

//获得解析器工厂

         DocumentBuilderFactory    factory = DocumentBuilderFactory.newInstance();

         //获得解析器

          DocumentBuilder builder = factory.newDocumentBuilder();

        //进行解析

         Document  doc = builder.parse(input);


        List<Person> personlist = new new ArrayList<Person>();

       //获得所有叫user的节点

        NodeList  list = doc.getElementsByTagName(user);

        String id="";
String name="";
String age="";
for(int i=0;i<list.getLength();i++){
//取得第i个user节点
Element node=(Element)list.item(i);
Person p=new Person();
//获取id属性
id=node.getAttribute("id");
//获得user节点下的子节点列表
NodeList userList=node.getChildNodes();
for(int j=0;j<userList.getLength();j++){
//判断是否是元素节点,name和age属于元素节点
if(userList.item(j).getNodeType()==Node.ELEMENT_NODE){

Element childNode=(Element)userList.item(j);
if("name".equals(childNode.getNodeName())){
name=childNode.getFirstChild().getNodeValue();
}
else if("age".equals(childNode.getNodeName())){
age=childNode.getFirstChild().getNodeValue();
}
p.setName(name);
p.setAge(age);
p.setId(Integer.parseInt(id));
}

}

personList.add(p);
}
return personList;

}

-------------------------3.Activity01继承Activity类----------------------------------------------------


 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        InputStream is=this.getClass().getClassLoader().getResourceAsStream("test.xml");
        DomService dom=new DomService();
        
        try {
List<Person> ps=dom.getPersons(is);
for(Person p:ps){
System.out.println(p.getId());
System.out.println(p.getName());
System.out.println(p.getAge());
}
} catch (Exception e) {
e.printStackTrace();
}
    }


--------------------------------------pull解析-----------------------------

》pull解析器简介

        1.pull解析器是android内置的解析器,解析原理与sax类似

        2.pull它提供了类似的事件。

              如:开始元素和结束元素事件,使用parse.next()可以进入下一个元素并触发相应的事件,事件将作为数值代码被发送

                      因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法获取下一个Text类型节点的值 


》pull与sax的不同之处

          1.pull读取xml文件后触发相应的事件调用方法返回的是数字。

          2.pull可以在程序中控制,想解析到哪里就可以停止到哪里

          3.Android中更推荐使用pull解析


》pull解析步骤

      1.创建解析器对象

          XmlPullParser paser = Xml.newPullParser();

      2.进行解析

             paser.setInput(input,"utf-8");

      3.产生第一个解析事件

              int eventType = paser.getEventType();

       4.可以使用循环判断是否继续解析

                while(eventType!=XmlPullParser.END_DOCUMENT){}





》解析实例

-------------------1。创建xml.及实例对象(Person.java)----------------略

--------------------2.pull解析(PullService .java)----------------------

List<Person> getAlPerson(InputStream is) throws XmlPullParserException, IOException{

List<Person> persons=null;
Person p=null;
XmlPullParser parser=Xml.newPullParser();
parser.setInput(is,"utf-8");
//获得事件类型
int type=parser.getEventType();
while(type!=XmlPullParser.END_DOCUMENT){

switch(type){

case XmlPullParser.START_DOCUMENT://文档开始
persons=new ArrayList<Person>();
break;
case XmlPullParser.START_TAG://元素开始
if(parser.getName().equals("user")){

p=new Person();
String id=parser.getAttributeValue(0);
p.setId(Integer.parseInt(id));
}
else if(parser.getName().equals("name")){
if(p!=null){

String name=parser.nextText();
p.setName(name);
}
}
else if(parser.getName().equals("age")){

String age=parser.nextText();
p.setAge(age);
}
break;
case XmlPullParser.END_TAG:
if("user".equals(parser.getName())){

persons.add(p);
p=null;
}
break;

}
type=parser.next();
}
return persons;
}
}

------------------------------------Activity类-----------------------------------

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        InputStream is=this.getClass().getClassLoader().getResourceAsStream("test.xml");
        PullService pps=new PullService();
        
        try {
List<Person> ps=pps.getPersons(is);
for(Person p:ps){
System.out.println(p.getId());
System.out.println(p.getName());
System.out.println(p.getAge());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

    }




-------------------------------------------------------------------------------------------------------------------

android解析XML总结(SAX、Pull、Dom三种方式)

http://www.cnblogs.com/JerryWang1991/archive/2012/02/24/2365507.html

深入理解XML解析:SAX, PULL, DOM方法 本文还有配套的精品资源,点击获取 简介:XML是用于标记数据的语言,广泛应用于多个领域。本文详细探讨了处理XML文档的三种主要解析技术:SAX、PULL和DOM。SAX解析器基于事件驱动,占用内存较少,但代码可能复杂;PULL解析器提供更面向对象的API,适合资源受限环境;DOM解析器将XML文档加载为树形结构,适合小型至中型文件,但内存消耗较大。文章通过实例展示了每种解析... 阅读详情

相关推荐

Android XML解析实战:SAX、DOM与Pull详解

SAX解析的核心在于“事件驱动”(Event-driven)。它不像DOM解析那样一次性将整个XML文档加载到内存中,而是逐行读取XML内容,当解析器遇到特定的结构(如开始标签、结束标签、文本内容等)时,会触发相应的回调事件。这些事件包括::文档开始解析时触发。:文档解析结束时触发。:遇到开始标签时触发。:遇到结束标签时触发。:读取到文本内容时触发。这些事件的处理由开发者自定义的子类来完成。通过重写这些方法,可以实现对XML数据的动态解析与处理。

weixin_35755823的博客 819

Android xml数据解析

Android xml数据解析方式一般有:XmlPullParser、DOM解析器、以及SAX解析器。

MengLong493的博客 688

android中xml的三种解析方式(DOM,SAX,PULL)

android中xml的三种解析方式(DOM,SAX,PULL)

XML三种解析方式 SAX、Dom、Pull

SAX解析: 1.解析效率高,占用内存少 2.可以随时停止解析 3.不能整个文档载入内存 4.不能写入xm 5.SAX解析采用事件驱动型 SAX并不需要解析整个文档,在按顺序解析文档的过程中,SAX会判断当前读到的字符是否合法xml中的部分,如果符合就触发 SAX工作原理:对文档进行顺序扫描,扫描到文档的开始和结尾,扫到元素的开始与结束等地方调用时间处理,处理函数做相应的动作,然后接

云淡风轻的博客 1143

Intel Realsense d435 使用python对深度图进行预处理

Intel Realsense d435 使用python对深度图进行预处理 本文中主要翻译一下一篇关于深度图预处理过滤器的内容,后面还会有关于距离测量的。 原文中的图像显示,是使用matplotlib.pyplot工具,在本文中,使用opencv来显示深度图》 首先常规操作导入包: import cv2 import numpy as np import pyrealsense2 as rs 获取我们所需要的图像,通过摄像头或者本地都可以 pipe = rs.pipeline() cfg = rs.co

qq_25105061的博客 1万+

【UE 反射】反射的原理是什么?如何使用机制?

静态类型检查确保了类型的早期一致性和高效的代码执行,但减少了灵活性。动态类型检查提供了更大的灵活性,但增加了运行时的开销和潜在的错误。反射作为一种动态特性,无论是在静态类型语言还是动态类型语言中,都提供了强大的运行时类型操作能力,但也伴随着性能和安全性方面的权衡。通过理解这些联系,开发者可以在不同的编程语言和应用场景中选择适合的类型检查方式和反射机制,以实现所需的动态行为和灵活性,同时保证性能和安全性。

hhw_hhw的博客 6034

SAX、DOM、PULL解析XML

-------------------------------------SAX解析xml---------------------------------- 》Sax定义          SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于android等移动设备          SAX全称是Simple API for Xml,既是指一种接口,也是一个软件包

ayayalynn的专栏 4585

基于继电器与三极管的自动水泵控制器DIY:从电路原理到PCB制作实战

继电器作为一种利用电磁原理实现电路通断控制的电气开关,其核心价值在于通过小电流信号控制大电流负载,实现强弱电之间的安全隔离。在自动化控制领域,继电器常与三极管等半导体器件配合,构成驱动电路,将微弱的传感器信号放大,从而可靠地控制电机、水泵等执行机构。这种组合技术广泛应用于工业控制、智能家居及各类电子DIY项目中,例如实现水箱水位的自动检测与控制。本文将以一个典型的自动水泵控制器项目为例,深入剖析如何利用继电器与三极管搭建水位检测与驱动电路,并详细讲解从电路设计、PCB自制(热转印法)到系统调试的完整工程实践

weixin_31774841的博客 348

sax dom pull 解析xml

一 sax 解析:注意空格。 1.   Java Sax解析是按照xml文件的顺序一步一步的来解析,在解析xml文件之前,我们要先了解xml文件的节点的种类,一种是ElementNode,一种是TextNode。如下面的这段book.xml Xml代码   xml version="1.0" encoding="UTF-8"?>   books>       bo

a2683901的专栏 493

AMBA-CHI协议详解(二)

读事务,写事务,原子事务,Stash事务,Dataless事务,DVM事务,Retry事务。

Crazzy_M的博客 6657

Spine骨骼动画查看器 - Skeleton Viewer

骨骼动画是现代游戏和动画制作中常用的技术之一。Spine骨骼动画查看器(Skeleton Viewer)是一个官方提供的工具,用于查看和调试Spine骨骼动画。本文将介绍Skeleton Viewer的功能和使用方法,并提供相应的源代码示例。通过Skeleton Viewer,开发者可以直观地查看和调试Spine骨骼动画,包括骨骼结构、动画播放和事件触发等。这有助于提高骨骼动画的质量和效果,并加速开发过程。以上代码演示了如何使用Skeleton Viewer查看和播放Spine骨骼动画。

HsvvDatabase的博客 3463

解析XML格式数据的三种方法Pull,Sax,Dom

既然要介绍这三种解析方法那么当然要说一下为什么用他们,用他们有什么优点和缺点。 首先说一下Dom解析: 优点:易用性强,使用DOM时,将把所有的XML文档信息都存于内存中,并且遍历简单,支持XPath,增强了易用性。 缺点:效率低,解析速度慢,内存占用量过高,对于大文件来说几乎不可能使用。另外效率低还表现在大量的消耗时间,因为使用DOM进行解析时,将为文档的每个element、attribu...

z1web的博客 426

简要介绍 | 雷达穿墙成像及其应用场景

本文简要介绍了雷达穿墙成像技术的原理、研究现状、挑战与未来展望,希望能为相关领域的研究与应用提供参考。具有广泛的应用前景。本文将详细介绍雷达穿墙成像的原理,以及其在不同应用场景中的实践。逆时偏移算法(Reverse-Time Migration, RTM)雷达穿墙成像技术是一种先进的遥感技术,具有。的能力,可用于探测室内目标。安全与救援、建筑结构检测等领域。雷达穿墙成像技术的核心原理是。是Green函数,表示从接收点。雷达穿墙成像及其应用场景。雷达穿墙成像及其应用场景。目标识别与定位准确性。

NLOS的博客 2233

Android解析XML三种方式(PULL、SAX、DOM)

本篇博客重点介绍Android中三种解析XML的方式,包括PULL、SAX、DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧。再顺便介绍一下AndroidTestCase的用法,用来测试所写的解析业务逻辑是否正确。 本篇博客使用的xml文件如下: student.xml ZhangSan

And.He 2725

一个 ABAP 工具,能打印系统里某个用户对 BSP 应用的浏览历史记录

只要一个用户在 SAP ABAP 系统里浏览过 BSP 页面,会留下浏览历史记录。本工具会解析出这些记录,打印出该用户浏览的历史事件,和浏览过的页面名称。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 546

电力负荷预测 | 电力系统负荷预测模型(Python线性回归、随机森林、支持向量机、BP神经网络、GRU、LSTM)

电力负荷预测 | 电力系统负荷预测模型(Python线性回归、随机森林、支持向量机、BP神经网络、GRU、LSTM)

天天酷科研的博客 3189

安卓XML解析的几种方式(DOM,SAX,PULL..)

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的优快云阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次 ...在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个andro...

一只小翊的博客 1371

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android之PULL、SAX、DOM解析XML

背景:解析天气预报的xml文件,在模拟器显示 解析前准备 layout目录下weather.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://sch...

阿宁的博客 1910

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

解析XML的几种方式的原理与特点:DOM、SAX、PULL

解析XML的几种方式的原理与特点:DOM、SAX、PULL。 XML的解析方式有很多,光开源的就有十多种:如Xerces、JDOM、DOM4J、XOM、JiBX、KXML、XMLBeans、jConfig、XStream、XJR等。 但是最常用的还是sax、dom、pull、dom4j 而android中用的比较多的是 sax(Simple APIs for XML)、dom(Documen...

tianhouquan的专栏 2444

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

解析XML的几种方式:DOM、SAX、PULL

DOM解析 解析器读入整个文档,然后构建一个主流内存的树结构,然后代码就可以使用dom接口来操作这个树结构。 优点: 整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能。 通过树形结构存取xml文档。 可以随时访问到某个节点的相邻节点。 缺点: 将整个文档调入内存(包括无用的节点),浪费时间和空间。 适用于: 一旦解析了文档还需多次访问这...

185

解析XML:DOM、SAX、PULL

这三种方法中DOM最耗内存,因为它是把整个文件加载进去然后进行分类整理的,PULL和SAX类似,只是SAX要用到一个解析类,类中的主要三个方法完成内容的解析。 》Sax定义          SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于android等移动设备          SAX全称是Simple API for Xml,既是指一种接口,也是

rabbit_in_android的博客 521

安卓使用DOM,SAX,PULL解析xml,安卓写入xml文件

Xml简介 对Xml不太了解的同学可以看一下这篇Xml的简介:http://www.cnblogs.com/SkySoot/archive/2012/08/24/2654319.html DOM解析Xml Dom解析Xml的时候,会将Xml文件的所有内容以文件树的形式存储到内存中,然后用户通过使用DOM API遍历Xml树,检索需要的内容。 但是,因为它将文件树放在了内存中,如果文件较大的

YanRu的专栏 934

Android三种解析xml文件的方法:SAX, PULL, DOM

在Android开发中,经常用到解析xml文件,常见的解析xml文件的方式有以下三种方式: 本节示例在最后可以下载运行 SAX, PULL , DOM 三种方式,下面把这三种xml的解析方式进行总结如下: 解析的xml文件示例如下: 百度 腾讯 新浪 淘宝 此时制作一个bean进行解析: public class channel { private Stri

人生起落,生活苦甜,坚持追求! 1629

Java进阶之Sax、Dom和Pull解析xml

1 概念   Java的xml解析器库有很多,万变不离其宗的就是SAX和DOM解析器。 1.1 DOM解析   DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访...

chenliguan的博客 519

pull,sax,dom解析XML

//pull解析public class MainActivity extends AppCompatActivity { private ListView lv; private List list ; private Button btn; @Override protected void onCreate(Bundle savedInstanceS

bian_xingkongjinghao的博客 221
上一篇: Java(六)运算符和表达式
下一篇: Java(七)synchronized详解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值