XML的四种解析方法
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6646572.html
XML文档以层级标签的形式来组织数据,多用于配置文件、存储静态数据、交换数据。
XML语法
1 每个XML文档都由XML序言开始,在前面的代码中的第一行便是XML序言,<?xml version="1.0"?>
2 任何的起始标签都必须有一个结束标签。
3 标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签。
4 标签如果有属性,属性值必须加双引号。
XML文档解析
首先我们要知道,“XML中的内容都是结点”,这句话的意思是:XML文档中,无论是 <> </> 符号的里面的内容(属性)、之间的内容(结点值)、还是 <> 本身(结点),都是Node,就连标签之间的换行、空格都是一个节点。明白这个很重要,因为下面遍历结点时,返回的 属性名值对 、结点值内容、结点本身 都是一个Node类型。
一:DOM方法
Java自身原生的两种解析XML方式之一——DOM方法,原理是:首先在内存中创建一个Document对象,然后把XML文档读取进来赋值给这个dom对象。由于dom对象是基于树结构的,所以对dom对象进行遍历即可。对内存中的dom对象可以进行查询、修改、删除操作,还可以写回原XML文档保存修改。
优点:
a、由于整棵树在内存中,因此可以对xml文档随机访问
b、可以对xml文档进行修改操作
缺点:
a、整个文档必须一次性解析完
a、由于整个文档都需要载入内存,对于大文档成本高
操作步骤:
1:创建DocumentBuilderFactory,由newInstance()方法获取工厂实例;
2:由工厂创建DocumentBuilder;
3:通过 Document dom=builder.parse(file); 读取xml文档创建dom对象;
4:通过dom对象的一系列方法获取某个结点、某名字的结点列表:
Element getElementById(String elementId)
返回具有带给定值的 ID 属性的 Element。
NodeList getElementsByTagName(String tagname)
按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList。
5:通过NodeList对象获取结点列表中某个结点:
Node item(int index)
返回集合中的第 index 个项。
6:通过Node对象读取结点属性:
NamedNodeMap getAttributes()
包含此节点的属性的 NamedNodeMap(如果它是 Element);否则为 null。
然后对NamedNodeMap对象调用以下方法获取属性:(前面我们说过,属性也是结点)
Node getNamedItem(String name)
检索通过名称指定的节点。 或 Node item(int index)
返回映射中第 index 个项。
最后,对返回的属性通过以下方法获取名、值:(属性也是结点)
String getNodeName()
此节点的名称,取决于其类型; String getNodeValue()
此节点的值,取决于其类型;
7:获取结点的子节点列表:
NodeList getChildNodes()
包含此节点的所有子节点的 NodeList。
8:获取结点值:
String getNodeName()
此节点的名称,取决于其类型; String getNodeValue()
此节点的值,取决于其类型;
总结:DOM方法解析XML文档,把元素、元素属性、元素值都看作Node类型,通过node.getNodeName()获取元素名、属性名,
通过getNodeValue()获取属性值、元素值,通过getChildNodes()获取子节点们,通过item(i)获取第i个属性或者第i个子节点。 二:SAX方法
Java原生的XML解析方法之二——SAX方法,原理:通过parse(file,listener)函数用一个listener对xml文件进行查找,按顺序读取文档,遍历每个标签,当发现目标标签
时,读取标签的属性、结点值等信息并返回。
优点:
a、无需将整个xml文档载入内存,因此消耗内存少
b、可以继承ContentHandler创建多个执行不同查询的listener进行解析操作
缺点:
a、不能随机的访问xml中的节点
b、不能修改文档
c、查询依次就要对XML文档从头到尾遍历一次
操作步骤:
1:创建解析工厂:SAXParserFactory factory = SAXParserFactory.newInstance();
2:由工厂创建解析器:SAXParser parser = factory.newSAXParser();
3:通过解析器的parse()方法,对指定xml文档以指定handler之类进行解析查询:parser.parse(xmlFile, new MySaxListener());
我们要继承DefaultHandler类,定义相应的查询操作类:
1:重写父类中的文档开始方法、文档结束方法,定义开始、结束遍历xml文档时的操作:
void startDocument()
接收文档开始的通知。 void endDocument()
接收文档结束的通知。
2:重写父类的标签开始方法、标签结束方法,定义遍历到一个开始、结束标签时的操作:
void startElement(String uri, String localName, String qName, Attributes attributes) //参数qName是标签名、attributes是属性列表
接收元素开始的通知。 void endElement(String uri, String localName, String qName)
接收元素结束的通知。
3:重写characters(char[] ch, int start, int length)方法:
// 对事件发生时,元素的字符怎么处理
public void characters(char[] ch, int start, int length) throws SAXException {
//参数ch是当上述4中事件随便一个发生时,对应的元素的值,值在ch中start开始,length长。从头到尾遍历整个xml文档时,每个标签的值依次被存入ch中。 }
也就是说,通过SAX解析xml文档是没有dom对象出现的,所以不会有node,不会有getNodeName()、getNodeValue()获取结点名、值。
总结:SAX解析XML文档的结点名是通过事件函数的参数qName获取的,属性是通过参数attributes的getValue("属性名")获取的,
结点值是通过当前事件函数发生时,characters(char[] ch, int start, int length)方法中的内容获取的。
三:JDOM方法
JDOM方法是根据DOM方法的众多繁琐操作进行包装得到的,上面我们看到,DOM方法解析XML文档其实是很繁琐的,而且很混乱,标签、属性、换行空格都当作结点类型来处理。JDOM方法定义了一系列通俗、好记的方法来解析XML,方法的底层封装了一系列DOM操作,但是我们不必亲自去进行这些繁琐的工作了。
优点:
a、DOM方式的优点:查找方便,可以修改
缺点
a、DOM方式的缺点:装载整个文档,对内存容量要求高
在JDOM中,同一了根节点、普通结点、属性等全为Element类型。
操作步骤:
1:创建一个SAXbuilder:SAXBuilder builder = new SAXBuilder();
2:创建文件输入流打开xml文件:InputStream in = new FileInputStream("XXX.xml");
3:通过builder,从输入流读取xml文件创建dom对象:Document dom = builder.build(in);
4:获取根节点:Element root=dom.getRootElement();
5:获取子节点列表:List<Element> childNodes = node.getChildren();
6:遍历子节点列表,获取第i个结点:Element node = childNodes.get(i);
7:读取结点信息:
1)结点属性值:node.getAttributeValue("属性名");
2)结点名:node.getName();
3)结点值:node.getValue();
4)子结点文本值:node.getChildText("子结点名");
四:DOM4J方法
Dom4j是目前最流行、最好用的XML解析工具,解析XML的速度最快。
操作步骤:
1:创建SAXReader:SAXReader reader = new SAXReader();
2:创建文件输入流打开xml文件:InputStream in = new FileInputStream("XXX.xml");
3:通过reader和输入流读取xml文件到内存创建Document对象:Document dom = reader.read(in);
4:获取根节点:Element root=dom.getRootElement();
5:获取子节点列表:List<Element> childNodes = root.elements();
6:遍历子节点:Element node = childNodes.get(i);
7:读取结点信息:
1)结点属性值:node.attributeValue("属性名");
2)结点名:node.getName();
3)结点值:node.getValue();
4)子结点文本值:node.elementText("子结点名")
总结:
1)DOM、JDOM、DOM4j都是把xml文档读取到内存中,生成dom对象进行遍历的;
DOM是Java原生的,所以比较繁琐;
JDOM是对DOM操作的封装,更加通俗、易记,操作也快了一点;
DOM4j解析xml的函数上与JDOM差不多,只不过有几个相同功能的函数名字不同而已,过程都是一样的;但由于底层使用了Xpath等方法加快了索引,所以检索性能更快。
2)SAX是基于事件驱动的,查询事件监听器继承自DefaultHandler,定义了检索xml过程中遇到开始标签、结束标签时执行的事件函数,从而查找需要的信息并返回而不是把整个文档都加载进来。
XML的四种解析方法的更多相关文章
- xml常用四种解析方式优缺点的分析×××××
xml常用四种解析方式优缺点的分析 博客分类: xml 最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下. 首先介绍一下xml语 ...
- XML解析——Java中XML的四种解析方式
XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...
- XML解析——Java中XML的四种解析方式(转载 by 龍清扬)
XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...
- xml的四种解析方式(转载)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- Java中XML的四种解析方式(二)
三.JDOM解析 特征: 1.仅使用具体类,而不使用接口. 2.API大量使用了Collections类. import org.jdom2.Attribute; import org.jdom2.D ...
- Java中XML的四种解析方式(一)
XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析的方式都是一样的,只不过实现的语法不同而已. XML文档以层级标签的 ...
- XML的四种解析器(dom_sax_jdom_dom4j)原理及性能比较[收藏]
1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定 ...
- XML的四种解析器原理及性能比较
转自zsq 1.DOM DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准.DOM 是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分 ...
- XML的四种解析方式
本文描述了构建良好的XML需要遵循的规则.作者详细介绍了构建XML需要考虑的元素,如何命名约定.正确的标记嵌套.属性规则.声明和实体,以及DTD和schema的验证,十分便于新手开始学习了解XML. ...
随机推荐
- 怪奇物语第二季/全集Stranger Things迅雷下载
Netflix的叫好叫座剧<怪奇物语 Stranger Things>第二季更新上线日期为美国时间10月27日,第二季讲述在1984年(相隔上季一年),印第安纳州的Hawkins镇市民仍然 ...
- 管理Mysql常用指令
知识会更新,数据库系统也一样,本文只保证对Mysql 5.7以及MariaDB 10有效. 编码篇 展示当前默认的编码和字符集 SHOW VARIABLES LIKE 'char%'; 修改服务器默认 ...
- Material Designer的低版本兼容实现(十二)—— Slider or SeekBar
Slider,我更喜欢叫他SeekBar,其实是一个东西啦,就是拖动条.5.0的拖动条和4.x上的HOLO风格完全不同,平添了一些精致.此外还加入了数值指示器,让用户在滑动的时候就能知道现在到了什么位 ...
- Eclipse中的特殊注释:TODO、XXX、FIXME
特殊注释: 1. TODO表示需要实现,但目前还未实现的功能 2 .XXX勉强可以工作,但是性能差等原因 3 .FIXME代码是错误的,不能工作,需要修复 TODO: + 说明:如果代码中有该标识,说 ...
- Apache Jmeter 教程
Jmeter是一款优秀的开源测试工具, 是每个资深测试工程师,必须掌握的测试工具,熟练使用Jmeter能大大提高工作效率. 熟练使用Jmeter后, 能用Jmeter搞定的事情,你就不会使用LoadR ...
- php定时回调接口
http://www.dewen.org/search/q/php%E5%AE%9A%E6%97%B6%E8%B0%83%E7%94%A8%E5%AD%98%E5%82%A8%E8%BF%87%E7% ...
- maven项目里,junit的test程序不能访问src/test/resource下面的配置
问题描述 最近在写单元测试,但是不想改动源代码,所以想自己在本test目录下建一个resouces文件夹并添加对应的配置文件,可是发现test程序无法读取这个resouces文件夹下的配置. 问题解决 ...
- Windows7安装CodeTyphon
WARNING 1: On windows (XP, Vista and Win7), you must install this software as user with administrato ...
- LeetCode 114| Flatten Binary Tree to Linked List(二叉树转化成链表)
题目 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解析 通过递归实现:可以用先序遍历, ...
- 利用vue-cropper做的关于图片裁剪、压缩、上传、预览等做的一个公共组件
公共组件: <template> <div> <div class="upload-box"> <div class="imag ...