眼下XML解析的方法主要用两种:

1、dom解析:(Document Object Model。即文档对象模型)是W3C组织推荐的解析XML的一种方式。

使用dom解析XML文档,该解析器会先把XML文档载入到内存中,生成该XML文档相应的document对象,然后把XML文档中的各个标签元素变成相应的Element对象。文本会变成Text对象,属性会变成Attribute对象,并按这些标签、文本、属性在XML文档中的关系保存这些对象的关系。

缺点:消耗内存。所以使用dom解析XML文档时不能解析太大的XML文档,否则有可能会造成内存溢出。

长处:使用dom解析XML文档能够非常方便的运行增删改查操作(能够直接依据节点相应的对象进行操作)。

2、sax解析:Simple API for XML,不是官方标准,但它是XML社区其实的标准,差点儿全部的XML解析器都支持它。

使用sax解析XML文档,该解析器会从上往下读。读一行。解析一行;

长处:由于它解析XML文档是採取读一行,解析一行的方式,所以它不会对内存造成压力。

缺点:不适合运行增删改查的操作(也是由于它解析XML文档时採取的读一行解析一行的方式,所以它不能往回操作)。仅仅适合对XML文档进行读取操作。



======================================================================================================



补充:



XML解析开发包:Jaxp(sun)、Jdom、dom4j;



======================================================================================================



调整JVM内存大小:





当我们要解析的XML文档内存比較大、并且要对该XML中的节点数据进行相关的操作时,使用这两种解析方式显然都会不方便,这时就须要调整JVM内存的大小了。

JVM默认的同意最大内存容量是64M(依据jdk的版本号不同,默认的最大容量值不一样,jdk5.0版本号的是64MB。jdk7版本号的是170MB)。

调整JVM内存大小的方法(对应的命令为:-Xmx内存大小值单位):



在Eclipse中的项目导航框中右击对应的Java程序》》Run As》》Open Run Dialog...》》打开Run对话框》》选择Arguments选项,在开窗体中有两个输入框,第一个是程序的參数输入框。第二个是VM的參数输入框,在第二个VM的參数输入框中输入Xmx200M》》点击右下角的Runbutton,运行对应的Java程序。就不会报OutOfMemoryError的错误了。

======================================================================================================



XML解析开发包:

1、JAXP:JAXP开发包是J2SE的一部分。它由javax.xml、org.w3c.dom、org.xml.sax包及其子包组成。

在javax.xml.parsers包中。定义了几个工厂类,程序猿调用这些工厂类,能够得到XML文档的dom或sax的解析器,从而实现对XML文档的解析。



首先、创建工厂:

DocumentBuilderFactory factory = DocumentBuilderFactroy.newInstance();//由于DocumentBuilderFactory类是抽象类。不能new出它的对象仅仅能调用它的静态方法获取它的对象。

其次、得到dom解析器:

DocumentBuilder builder = factory.newDocumentBuilder();

然后、载入XML文档。得到代表文档的Document对象:

Document document = builder.parse("*.xml");

拿到代表XML文档的document对象就能够操作XML文档中的各个节点了。

======================================================================================================



补充:

dom解析下,XML文档的每个组成部分都会用一个对象表示。比如标签用Element。属性用Attribute,但无论什么对象。都是Node的子类,所以在开发中能够把获取到的随意节点都当作Node对待。

XML编程(CRUD)

create、read、update、delete

加入、查询、更新、删除;



除了这两种解析方法外,还有另外的解析方法。。

======================================================================================================



在对XML文档进行加入、改动和删除操作时,不仅要更新document对象还要更新XML文档(把更新后的document对象重写到XML文档中)。



javax.xml.transform包中的Transformer类用于把代表XML文档的Document对象转换为某种格式后输出,比如把XML文档应用样式表后转换成一个HTML文档。利用这个对象,当然也能够把Document对象又又一次写入到一个XML文档中。源和目的地。能够通过:

javax.xml.transform.dom.DOMSource类来关联要转换的document对象,

用javax.xml.transform.stream.StreamResult对象来表示数据的目的地。

Transformer对象通过TransformerFactory获得。

Transformer类通过transform方法完毕转换操作。该方法接收个

(工厂对象(TransformerFactory)》》》转换器对象(Transformer)》》》转换方法(transform(DOMSource 源。StreamResult 目的地);))

======================================================================================================



SAX解析:



SAX解析採用事件处理的方式解析XML文件。利用SAX解析XML文档,涉及两个部分:解析器和事件处理器:

解析器能够使用JAXP的API创建。创建出SAX解析器后,就能够指定解析器去去解析某个XML文档。

解析器採用SAX方式在解析某个XML文档时。它仅仅要解析到XML文档的一个指定部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的XML文件内容作为方法的參数传递给事件处理器。

事件处理器由程序猿编写,程序猿通过事件处理器中方法的參数,就能够非常轻松的得到SAX解析器解析到的数据,从而能够决定怎样对数据进行处理。

1、创建解析工厂;

SAXParserFactory fac = SAXParserFactory.newInstance();



2、获取解析器。

SAXParser sp = fac.newSAXParser();



3、得到读取器;

XMLReader re = sp.getXMLReader();



4、设置内容处理器;

re.setContentHandler(new ContentHandler(){ /*实现接口的代码块*/});

(或者:re.setContentHandler(new DefaultHandler());/*參数为DefaultHandler类的子类*/)

第一种方法是解析整个XML文档。另外一种方法能够仅仅解析某个标签;

事实上另一种内容处理器,也是先继承DefaultHandler类,然后把解析的内容封装到bean对象中。 



5、读取XML文档内容。

re.parse("*.xml"); 



======================================================================================================



XML解析开发包:



2、dom4j:



SAXReader saxReader = new SAXReader();

Document doc = saxReader.read(new File());



OutputFormat format = OutputFormat.createPrettyPrint();//该对象标明格式按美丽的格式进行输出;另外另一个对象是按紧凑的格式进行输出;

format.setEncoding("UTF-8");



XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(),format);

xmlWriter.write(doc);//假设xmlWriter对象採用的流是字节流,那么该对象会先把doc对象按format对象给定的编码格式转换成字节,然后把数据交给字节流进行操作。

writer.close();//最后要关闭资源



======================================================================================================



XPath:

使用XPath能够高速定位到某个节点。

List list = document.selectNodes("//foo/bar");//获取foo节点下的全部bar节点;



Node node = document.selectSingleNode("//foo/bar");//获取foo节点下的第一个bar节点;



单斜杠是绝对路径即从根节点開始;

双斜杠是相对路径即从全部当前节点開始。



星号“*”表示选择全部由星号之前的路径所定位的元素;

比如:

/aa/bb/*表示选择全部路径依附于/aa/bb的元素;

/*/*/*/bbb表示选择全部的有3个祖先元素的bbb元素;

//bb[@*]表示选择有随意属性的bb元素。

//bb[not(@*)]表示选择没有属性的bb元素;

//bb[@id='b1']表示选择含有属性id='b1'的bb元素;

XML 解析---dom解析和sax解析的更多相关文章

  1. Android 之XML数据解析(2)—— SAX解析

    (以下文章基本照抄郭霖大神的<第一行代码>) 在Android之 解析XML文件(1)—— Pull解析 中我们讲了Pull方式解析XML文件.今天讲另外一种方式,SAX解析XML文件. ...

  2. DOM&SAX解析XML

    在上一篇随笔中分析了xml以及它的两种验证方式.我们有了xml,但是里面的内容要怎么才能得到呢?如果得不到的话,那么还是没用的,解析xml的方式主要有DOM跟SAX,其中DOM是W3C官方的解析方式, ...

  3. Android使用SAX解析xml

    一.理论准备     SAX采用事件驱动机制来解析XML文档,每当SAX解析器发现文档开始.元素开始.文本.元素结束.文档结束等事件时,就会向外发送一次事件,而开发者则可以通过编写事件监听器处理这些事 ...

  4. Android XML文档解析(一)——SAX解析

    ---------------------------------------------------------------------------------------------------- ...

  5. Android中XML解析-SAX解析

    昨天由于时间比较匆忙只写了Android中的XML解析的Dom方式,这种方式比较方便,很容易理解,最大的不足就是内容多的时候,会消耗内存.SAX(Simple API for XML)是一个解析速度快 ...

  6. Android使用SAX解析XML(4)

    util.java文件如下: package com.hzhi.my_sax; import java.io.IOException; import java.io.InputStream; impo ...

  7. JavaScript使用浏览器内置XML解析器解析DOM对象

    所有现代浏览器都内建了供读取和操作 XML 的 XML 解析器.解析器把 XML 转换为 XML DOM 对象 (可通过 JavaScript 操作的对象). 一.获取DOM对象 XMLHttpReq ...

  8. XML解析之DOM详解及与SAX解析方法的比较

    XML解析(DOM) XML文件解析方法介绍 我们所用到的NSXMLParser是采用SAX方法解析 SAX(Simple API for XML) 只能读,不能修改,只能顺序访问,适合解析大型XML ...

  9. XML文件解析DOM解析和SAX解析

    解析一个XML文档有哪些内容解析有:dom和sax两种dom:把整个XML文档放入内存,适合XML随机访问,占用内存资源大sax:事件驱动型的XML解析方式,顺序读取,不用一次装载整个文件,遇到标签会 ...

  10. iOS开发中XML的DOM和SAX解析方法

    一.介绍 dom是w3c指定的一套规范标准,核心是按树形结构处理数据,dom解析器读入xml文件并在内存中建立一个结构一模一样的“树”,这树各节点和xml各标记对应,通过操纵此“树”来处理xml中的文 ...

随机推荐

  1. esql开发总结

    1 定义或者声明方法 int method(char *arg1,char* arg2...);   实现方法 int method(char *arg1,char* arg2...)     EXE ...

  2. 通过setSystemUiVisibility实现状态栏跟Activity之间的位置关系

    曾经说到去除状态栏和标题栏总会用到动态代码的方式实现: getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , Windo ...

  3. ubuntu16.04 安装 docker-compose

    下载安装 docker-composecurl -L https://github.com/docker/compose/releases/download/1.15.0/docker-compose ...

  4. 请问具体到PHP的代码层面,改善高并发的措施有哪些

    1.今天被问一个问题:请问具体到PHP的代码层面,改善高并发的措施有哪些? 面对高并发问题我首先想到的是集群.缓存(apt.redis.mem.内存...),但具体到PHP代码层面除了想到队列.减少网 ...

  5. memcache session共享问题(ubuntu)

    memcache session共享问题 环境:三台ubuntu 12.04.5虚拟机,均安装php-fpm,并重用了之前搭建的简单的负载均衡 u1(192.168.240.130)    u2(19 ...

  6. CDR中如何将对象在页面居中显示

    利用CorelDRAW在做设计排版时,如果想让对象在页面居中显示你会用什么方法?用鼠标拖?还是更准确的做法选择参照物对象,利用对齐与分布命令?或者还有更简单快速的方法,一起来看看吧! 最简单的方法(页 ...

  7. css——overflow

    Overflow:属性规定当前内容溢出元素框时发生的事情 1.当内容过多,元素框溢出 1)hidden:隐藏超出部分(overflow: hidden;) 2)auto:有下拉滚动条(overflow ...

  8. 在使用easyui datagrid在tab中遇到的问题

    当切换tab时,数据加载了,但是table的宽和高不能不能够初始化. 郁闷了好久解决了这个问题: 在页面加载时和切换tab时,获取当前tab的名字,进行内容的初始化 $('a[name="m ...

  9. 一些AngularJs

    # AngularJs部分 #     详情可参考文档----依赖注入--不是主动地获取而是被动的接收,需要什么就要什么,这样灵活较高,如:$scope ----指令--内部:ng-    如:ng- ...

  10. Proxifier安装与使用

    Proxifier安装与使用 1.Proxifier官网可能打不开,这是一个下载地址,提取码为p1l8. 用户名随意填 注册码下边 5EZ8G-C3WL5-B56YG-SCXM9-6QZAP G3ZC ...