XML的几种解析方式,及其代码实现

实现XML解析的几种技术 XML在各种开发中都广泛应用,Android也不例外。作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法。 在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。 第一种方式:DOM解析器: DO 阅读详情

常用的几种解析XML的技术!

A:DOM:在内存中构建一颗倒挂的树,通过对内存中的节点进行操作从而解析XML

缺点:由于需要根据XML文档构造倒挂的树,所以当XML文档比较大时,非常耗内存。有造成内存溢出的危险。不适合移动设备的开发.

B:SAX:基于事件驱动的方式解析XML(推模式PUSH)

C:JDOM:对DOM模型的简化,专门针对Java语言解析XML而设计的

D:DOM4J:融入了XPath语法等,是目前解析XML功能最强大的一门技术

E:PULL:基于事件驱动的方式解析XML.(拉模式(PULL))!


在xml解析过程中有一个共性:xml开始标签->xml文本内容->xml结束标签->空白文本内容->下一个xml开始标签


(1)DOM解析

     //声明books集合用于存每个book对象

List<Book> books=new  ArrayList<Book>();

       //1.通过调用DocumentBuilderFactory的静态方法newInstance()得到DOM解析器工厂对象

        DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();

            //2.通过DOM解析器工厂对象得到DOM解析器对象

            DocumentBuilderdocumentBuilder= documentBuilderFactory.newDocumentBuilder();

           //3.以流的形式指定要解析的XML文件并返回文档对象

            InputStreaminputStream=Thread.currentThread().getContextClassLoader().getResourceAsStream("books.xml");

            Document document=documentBuilder.parse(inputStream);     

            //4.通过文档对象得到根节点对应的元素对象

            Elementroot=document.getDocumentElement();

            //5.根据节点的名称得到节点的集合

            NodeListbook_nodeList=root.getElementsByTagName("book");

            //6.返回节点的个数

            int len=book_nodeList.getLength();

            //System.out.println("len="+len+",book_nodeList="+book_nodeList);

            //7.遍历节点并获取需要的数据

            for(inti=0;i<len;i++){

                //根据索引获取指定的节点对象

                Node node_book=book_nodeList.item(i);

                //将节点向下转型成元素,为什么要转?因为只有元素对象采用根据属性名获取属性值的方法Stringvalue=getAttribute(name);

                Element element_book=(Element) node_book;

               //获取此节点元素的属性值

                String isbn=element_book.getAttribute("isbn");

               //这里获得的element_book其实是一个集合对象,根据getElementsByTagName方法获得的标签元素也是集合,但因为只有一个集合元素,所以直接item(0),然后获取其标签文本内容,getTextContent();

                String name=element_book.getElementsByTagName("name").item(0).getTextContent();

                String author=element_book.getElementsByTagName("author").item(0).getTextContent();

                String price=element_book.getElementsByTagName("price").item(0).getTextContent();

                String publish=element_book.getElementsByTagName("publish").item(0).getTextContent();

                //将遍历得到的每组元素里面的小元素值通过构造函数存放到book对象中去

                Book book=new Book(isbn,name,author,price,publish);

                //将每个对象存放到Arraylist集合当中去

                books.add(book);

   (2)SAX解析

    //1.通过调用SAXParserFactory工厂的静态方法newInstance()得到SAX解析器工厂对象

        SAXParserFactorysaxParserFactory=SAXParserFactory.newInstance();

            //2.通过SAX解析器工厂对象得到SAX解析器对象

             SAXParsersaxParser=saxParserFactory.newSAXParser();

             //3.指定要解析的Xml文件路径及其解析器对象

             InputStreaminputStream=Thread.currentThread().getContextClassLoader().getResourceAsStream("books.xml");

             saxParser.parse(inputStream, new MyHandler());

           //try catch省略

4.编写处理器类中相关的方法,必须继承DefaultHandler或者实现ContentHandler接口,建议继承DefaultHandler,并重写其中的常用方法

         startDocument():开始解析Xml文档时自动调用的方法

         startElement():遇到开始标签时自动调用的方法

         characters():遇到文本元素时自动调用的方法

         endElement():遇到结束标签时自动调用的方法

         endDocument():解析Xml结束后自动调用的方法


    //自定义SAX解析器类必须继承DefaultHandler或者实现ContentHandler接口,建议继承DefaultHandler

    private static classMyHandler extends DefaultHandler{

            // 声明存储Book对象的数据源

        private List<Book> books;

            //声明Book对象

        private Book book;

           //定义用来存储当前正在解析的节点的前面的标签名

        private String parent;

           //当收到一个开始解析Xml的通知的时候自动调用的方法,这个方法在整个Xml解析过程中只调用一次

        @Override

        public void startDocument()throws SAXException{

            books=newArrayList<Book>();  //当开始解析xml文档时开始声明一个ArrayList()集合 用于存放每个书的信息的对象

            System.out.println("=======startDocument()=========");

        }

        //当遇到Xml的开始标签时自动调用的方法,调用多少次取决于指定的Xml文件中有多少个开始标签

         //@param qName是我们解析Xml节点的标签名

        @Override

        public void startElement(String uri, StringlocalName, String qName,

                Attributes attributes) throws SAXException {

            this.parent=qName;//在遍历到开始标签时将此标签名用parent记录下来

            if("book".equals(qName)){

                book=new Book();//如果遍历标签时遍历到了每组数据的开始标签则new一个对象

                //根据属性名获取属性值

                Stringisbn=attributes.getValue("isbn");

                book.setIsbn(isbn);

            }

            System.out.println("=====startElement(Stringuri="+uri+", String localName="+localName+", StringqName="+qName+",Attributesattributes="+attributes+")========");

        }

         //当遇到文本元素时自动调用的方法

        @Override

        public void characters(char[] ch, int start,int length)

                throws SAXException {

            Stringdata=new String(ch,start,length);

          //当遍历到文本时它前面为开始标签名等于一下内容时,将文本内容存放到对应的对象中去

            if("name".equals(parent)){

                this.book.setName(data);

            }elseif("author".equals(this.parent)){

                this.book.setAuthor(data);

            }elseif("price".equals(parent)){

                this.book.setPrice(data);

            }elseif("publish".equals(parent)){

                this.book.setPublish(data);

            }

            System.out.println("=====characters(char[]ch, int start, int length).data="+data);

        }

      // 当前遇到Xml的结束标签时自动调用的方法,调用多少次取决于当前Xml文件中有多少个结束标签

        @Override

        public void endElement(String uri, StringlocalName, String qName)

                throws SAXException {

            //在遇到结束标签时必须将parent的值赋为null,否则会产生空白(空格,回车,换行)覆盖之前文本的情况,因为结束标签和开始标签之间的文本也会调用方法,如果没parent没置空,则此时意味着空白文本前世开始标签,则会覆盖正确的文本

            this.parent=null;

            if("book".equals(qName)){

                this.books.add(book);//如果扫描结束标签时扫到这组的结束标签,则意味着这组结束,将这组的信息以对象的方式存放到 集合当中去

            }

            System.out.println("====endElement(Stringuri="+uri+", String localName="+localName+", StringqName="+qName+")=====");

        }

          //当收到一个当前文件解析完毕的通知后自动调用的方法,这个方法在整个Xml解析过程中也只调用一次

        @Override

        public void endDocument() throwsSAXException {

            System.out.println("books="+this.books);//结束解析后输出集合中的信息

            System.out.println("======endDocument()====");

        }

    }

}

(3)pull解析

     在使用pull解析之前在java项目中需要导入第三方jar包,Android不需要。


* PULL解析:拉模式的解析方式

 * 实现步骤:

 * 1.得到PUll解析器工厂对象

 *     XmlPullParserFactoryxmlPullParserFactory=XmlPullParserFactory.newInstance();

 *  2.通过工厂对象得到PULL解析器对象

 *     XmlPullParser xmlPullParser=xmlPullParserFactory.newPullParser();

 * 3.指定要解析的Xml文件以流的形式,同时指定编码表

 *     InputStreaminputStream=Thread.currentThread().getContextClassLoader().getResourceAsStream("books.xml");

        xmlPullParser.setInput(inputStream,"UTF-8");

    4.得到当前的事件值

        inteventType=xmlPullParser.getEventType();

    5.循环推动事件流解析XML中的数据

        while(eventType!=XmlPullParser.END_DOCUMENT){//当没遍历到文档结束之前依次遍历

                switch(eventType) {

                    case XmlPullParser.START_DOCUMENT://当文档开始遍历时声明集合对象

                        books=newArrayList<Book>();

                        break;

                    case XmlPullParser.START_TAG:  //遍历开始标签

                        StringstartTag=xmlPullParser.getName();//得到当前正在解析的标签名

                        if("book".equals(startTag)){

                            book=new Book();

                            String isbn=xmlPullParser.getAttributeValue(null,"isbn");

                            book.setIsbn(isbn);

                        }elseif("name".equals(startTag)){

                            //得到当前标签下的文本内容,此时事件流会继续向后推动

                            String name=xmlPullParser.nextText();

                            book.setName(name);

                        }elseif("author".equals(startTag)){

                            String author=xmlPullParser.nextText();

                            book.setAuthor(author);

                        }elseif("price".equals(startTag)){

                            String price=xmlPullParser.nextText();

                            book.setPrice(price);

                        }elseif("publish".equals(startTag)){

                            String publish=xmlPullParser.nextText();

                            book.setPublish(publish);

                            books.add(book);

                           

                        }

                        System.out.println("===XmlPullParser.START_TAG中的startTag="+startTag);

                        break;

                    case XmlPullParser.END_TAG://遍历到结束标签

                        StringendTag=xmlPullParser.getName();//得到当前正在解析的标签名

                        System.out.println("===XmlPullParser.END_TAG中的endTag="+endTag);

                        break;

                    case XmlPullParser.TEXT://遍历到文本内容

                        System.out.println("===XmlPullParser.TEXT=====");

                        break;

                    default:

                        break;

                }

                //将事件流继续向后推动

              //这句话是pull解析所必须的,因为pull解析是拉着进行的,没有这句话则会进入死循环,初学者注意

                eventType=xmlPullParser.next();

            }



Android 中 解析 XML 文件的几种方式 根据 book.xml 内容定义配套的数据类:DOM 解析:适合解析较小的 XML 文件,可以方便地访问和修改 XML 的任意部分。SAX 解析:适合解析较大的 XML 文件,内存占用低,解析速度快。Pull 解析:适合Android 环境,性能好,内存占用低,解析速度快。根据你的具体需求选择合适的解析方式。如果 XML 文件较小且需要频繁访问,DOM 解析是一个不错的选择;如果 XML 文件较大,推荐使用 SAX 或 XmlPullParser 解析。 阅读详情

相关推荐

xml编码/解码类

xml生成类 编码解码类

解析XML的两种方式

解析XML的方式分为两种: 文档对象模型(Document Object Model)即DOM,该解析器为树形解析器,DOM解析器会将XML文档解析为对应的树形结构。 XML简单接口(Simple API for XML) 即SAX,该解析器为流机制解析器,SAX解析器会将读入XML文档中的各个部分作为事件。 由于DOM解析器会将整个XML文档的内容转化为树形结构,故需要消耗大量的内存。其好处在于,我们可以随时查找之前的元素或文本。如果,我们不需要关注已遍历过的文本内容,那么我们就选用SAX解析方式。

qq_35769974的博客 839

保姆级教程:在STM32H750VBT6上跑起来CMSIS-DSP库(基于CubeMX+Keil)

本文详细介绍了在STM32H750VBT6微控制器上配置和运行CMSIS-DSP库的全过程,包括开发环境搭建、CubeMX工程配置、Keil工程设置以及DSP库的实际应用示例。通过FFT频谱分析和音频均衡器等实战案例,展示了如何利用STM32H750VBT6的硬件FPU加速DSP运算,提升实时信号处理性能。

weixin_30236595的博客 458

关于XML解析的一些代码

最近项目中需要添加一个给客户发送消息的功能,需要把消息模板放在xml文件中,模板如下: root> name>张三name> age>23age> notice>尊敬的 {0} 用户,您好:平台撤销了 {1} 产品下的 {2}、{3} 服务,请您根据情况进行修改!notice> root> 需要在相对应的位置上输入用户名、产品名、服务名等信息,写了一个解析xml的工具类,如下

爱吃袜子的二哈 1924

Node-Red系列教程——NodeRed通过OPC UA读取数据并写入mysql

NodeRed通opcua读取西门子数据并存入mysql

鲸鱼姐的专栏 1万+

CY7C68013 C0模式启动

C0或是C2启动的目的,是更改USB芯片的ID信息,并把固件载入到芯片内部RAM中运行。C0模式是指只从EEPROM中载入USB ID信息,因为只有ID信息(8个字节),所以只需要一个小容量的EEPROM即可。当然大容量的EEPROM也可以使用C0模式,但是小容量的EEPROM只能使用C0模式启动。如下图所示: 使用小容量的EEPROM要将A0,A1,A2接地。 这里我用了个24LC01,容量1

Fezl的博客 1740

java构造xml_Java中如何构造、生成XML简明

Java中如何构造、生成XML简明本文介绍在Java编程时,如何快速的构造一个XML片段,然后再将这个XML输出出来。在日常使用Java开发时,经常会用到XML。XML用起来好用,但写起来烦,有没有很简单的构造与输出方法呢?且往下看。1、导入jar包与命名空间要在Java中使用XML,建议先导入一个jar包——dom4j。这是一个专门用于处理XML的jar包,非常好用。然后import下面这三个类...

weixin_42360993的博客 401

CANoe进阶实战(第十一章)-LIN节点测试调度

《CANoe快速入门实战:LIN节点调度开发》摘要 本文是CANoe系列教程的第十一章,重点讲解如何通过CAPL编程实现LIN报文的灵活调度控制。文章采用"输入-输出-过程"三步骤法,详细介绍了调度表函数linChangeSchedTable()、启动/停止函数linStartScheduler()/linStopDisturbance()等关键API的使用方法。作者创新性地通过系统变量在Test节点间接控制Network节点的调度功能,并提供了完整的节点代码实现方案。最后的Trace窗

weixin_53605885的博客 1022

xml简介简单xml代码_XML简介

关于本教程 我应该学习本教程吗? 这本新修订的教程讨论了XML是什么,为什么开发XML以及它如何塑造电子商务的未来。 在此过程中,它还将介绍几种XML标准和编程接口,展示如何开始使用该技术,并描述了两家公司如何构建基于XML的解决方案来简化和简化其企业。 在本教程中,您将学习: 为什么创建XML XML文档规则 如何定义XML文档可以包含和不能包含的内容 使用XM...

cuyi7076的博客 5396

Shell数学计算(算术运算,加减乘除运算)

声明: 本篇博客的学习途径主要为以下网站和课堂讲解,发博客目的仅为学习使用,在该博客的基础上做了一定程序的简略和修改。 参考博客 : 原文链接:http://c.biancheng.net/shell/ Shell数学计算Shell数学计算数学计算命令对整数进行数学运算: (()) / let / $[] /exprShell (())Shell let命令bc命令:一款数学计算器在 Shell 中使用 bc 计算器 Shell数学计算 默认情况下,Shell 不会直接进行算术运算,而是把+两边的数据(数

AKUANer的博客 2万+

2025华为杯第二十二届中国研究生数学建模竞赛A题:通用神经网络处理器下的核内调度问题 - 完整解题分析+完整MATLAB源码!

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 2053

XML字符串Base64解码并获取XML中的数据

XML字符串Base64解码并获取XML中的数据

qq_54571327的博客 2157

基于 MFC C++ 的心电监测客户端

4. **报警功能**:使用 `PlaySound` 播放报警音(需准备 `alert.wav` 文件),界面显示报警状态。

寒寒豆豆软件公司的博客 92

XML解析的几种方式

xml的四种解析方式实例 一、DOM(Document Object Model)解析方式 在应用程序中,基于DOM的xml分析器将xml文档解析成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对xml数据的操作.通过DOM接口应用程序可以在任何时候访问xml文档的任何一部分数据. DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对

曹海成的专栏 4198

视觉Transformer实战 | Token-to-Token Vision Transformer(T2T-ViT)详解与实现

Vision Transformer (ViT) 在计算机视觉领域取得了巨大成功,但标准的 ViT 存在一些局限性,如需要大规模预训练数据、对局部结构建模不足等。Token-to-Token ViT (T2T-ViT) 通过引入渐进式分词过程改进了原始 ViT,使其能够在中小型数据集上取得更好的性能。本节将详细介绍 T2T-ViT 的技术原理,并使用 PyTorch 从零开始实现 T2T-ViT。

盼小辉丶的博客 4万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

什么是xml解析?xml解析的有几种常用的解析方式?

SAX解析只能查询,不能实现增删方法,不常用,这里就不过得介绍了

superliug的博客 6130

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

XML几种解析方式以及其试用场景

XML解析方式 XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标

beagreatprogrammer的专栏 1846

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android中解析xml的几种方式

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,在android等移动设备上推荐大家使用Pull解析器 生成实现代码: [java] view plaincopy

逍遥飞鹤的专栏 794

Java中XML解析的方式介绍和实现

在日常开发中常见的XML解析方式有如下两种。

YingHuaBuRuTa的博客 3181

深入解读Python解析XML的几种方式 及 ElementTree模块的使用

这篇文章主要为大家详细介绍了深入解读Python解析XML的几种方式,以ElementTree模块为例,演示具体使用方法和场景,感兴趣的小伙伴们可以参考一下 在XML解析方面,Python贯彻了自己“开箱即用”(batteries included)的原则。在自带的标准库中,Python提供了大量可以用于处理XML语言的包和工具,数量之多,甚至让Python编程新手无从选择。 本文将介绍深入解...

weixin_39274753的博客 2万+

Java中解析xml的几种方式

DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。 DOM接口提供了一种通过分

diamondy的专栏 1585

XML/JSON的几种解析方式

SA

JerryLeeFighting的专栏 2304

解析XML的几种方式

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definit

yuan16423276的专栏 3万+

Android几种解析XML方式的比较

XML介绍:Extensible Markup Language,即可扩展标记语言 一、使用SAX解析XMLSAX(Simple API for XML) 使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。 缺点是不能倒退。二、使用DOM解析XMLDOM(Document Object Model) 是一种用于XML文

Just do it 1万+

XML学习之Dom方式解析XML文件

XML学习之Dom方式解析Xml文件 一、java解析XML概述   1.Xml解析方式分为两种:Dom方式和SAX方式。    (1)、DOM方式:Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。    (2)、SAX:Simple API for XML。这种方式不是官方标准,属于开源社区XML-DEV,   但是几乎所有的XML解

yanyu110991的专栏 3505

XML解析——Java中XML的四种解析方式

  XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已。   XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩...

Sa916487698的博客 2023
上一篇: 掌握HttpClient类的GET和POST请求访问服务器步骤!
下一篇: java反射机制 以及通过反射获得类的变量字段,方法,构造函数
AlwaysDebug
博客等级 码龄11年 2粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值