JAVA 解析XML文件

本文介绍了XML的基本概念及其与HTML的区别,并探讨了三种XML解析方式:DOM、SAX和JDOM。重点讲解了使用JDOM和DOM4J在Java中解析XML文件的方法,包括导入库、解析XML并获取特定元素的步骤。文章指出,尽管JDOM和DOM在性能上可能不如其他解析器,但它们提供了易用的API。
摘要由CSDN通过智能技术生成

什么是XML文件?

XML,可扩展的标识语言(eXtensibleMarkupLanguage)

XML是一种类似于HTML的标记语言,XML是用来描述数据的,XML的标记不是在XML中预定义的,你必须定义自己的标记,XML使用文档类型定义(DTD)或者模式(Schema)来描述数据,XML使用DTD或者Schema后就是自描述的语言,XML(eXtensibleMarkupLanguage)是可扩展标记语言,它与HTML一样,都是处于SGML,标准通用语言。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。

XML与HTML的语言风格相似,但他们之间也有很大的区别:

    1.XML扩展性比HTML强

XML(Extensible Markup Languages)是扩展标记语言的英语缩写,他可以创建个性化的标记语言,可以称之为元语言。XML的标记语言可以自定义,这样可以提供更多的数据操作,而不像HTML一样,只能局限于按一定的格式在终端显示出来。HTML的功能只有浏览器放入显示和打印,仅仅适合静态网页的要求。

2.XML的语法比HTML严格

由于XML的扩展性强,它需要稳定的基础规则来支持扩展。它的严格规则为:

①起始和结束的标签相匹配

②嵌套标签不能相互嵌套

③区分大小写

相对应XML的严格规则,HTML语言并没有规定标签的绝对位置,也不区分大小写,而这些全部由浏览器来完成识别和更正。

3.XML与HTML互补

XML可以获得应用之间的相应信息,提供终端的多项处理要求,也能被其他的解析器和工具所使用,在现阶段,XML可以转化成相应的HTML,来适应当前浏览器的需求。

有什么方法可以解析XML?

1.DOM

DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。但是由于使用规则过于繁琐,这里我们不作介绍。

2.SAX

SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据,所以这里也不作介绍。

3.JDOM

JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。


接下来,来用JDOM简单解析XML文件:

我们要解析这个XML文件,从中获取每个Student元素里的age、name、sex元素



我们要使用JDOM,就要获取JDOM的jar包,关于文件jar包的获取方法有两种:

一:下载JDOM的jar包,然后把jar包导入到相关项目中

这是JDOM  2.05的下载链接:http://mvnrepository.com/artifact/org.jdom/jdom2/2.0.5

二:导入jar包的<dependency></dependency>(博主推荐)

把项目转成maven属性的项目,然后去mvn资源库中把要用到的jar包的<dependency></dependency>放入到pom.xml中


具体如何操作可以参考链接:

http://blog.csdn.net/ricky73999/article/details/54989972

导入包后,我们来进行代码演示(部分代码有注释)

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

public class JdomDemo {
	public static void test1(){
		//使用SAXBuilder为解析XML搭建通道
		SAXBuilder sb=new SAXBuilder();
		try {
			//读取文件,并把文件转成DOC对象,便于后面的解析
			Document doc =sb.build(new FileInputStream("src/b.xml"));
			//获取文件的根元素,也就是最外层的元素Students
			Element rootElement=doc.getRootElement();
			//获取根元素下的所有子元素,存取在List中
			List<Element> elementList=rootElement.getChildren();
			for (Iterator iterator = elementList.iterator(); iterator.hasNext();) {
				//获取每个student元素
				Element element = (Element) iterator.next();
				//获取student的子元素name、age、sex的内容,并输出
				String name=element.getChildText("name");
				String age=element.getChildText("age");
				String sex=element.getChildText("sex");
				System.out.println(name);
				System.out.println(age);
				System.out.println(sex);
			}
		} catch (JDOMException | IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		test1();
	}
}




4.DOM4J(DOM for java)

DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写 XML,特别值得一提的是连Sun的JAXM也在用DOM4J,目前最多人用来解析XML的工具。

首先同样把DOM4J的jar包导入项目中,写代码时注意import的包名,小心导入JDOM的包了。

我们同样获取如上的目标元素的内容,然后来比较一下代码的区别。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.xml.sax.SAXException;

public class Dom4jDemo {
	public static void test1(){
		//SAXReader对象可以传入输入流或者文件
		SAXReader reader=new SAXReader();
		try {
			//读取文件,并把文件转成DOC对象,便于后面的解析
			Document doc=reader.read(new FileInputStream("src/b.xml"));
			//获取文件的根元素,也就是最外层的元素Students
			Element rootElement=doc.getRootElement();
			//获取根元素下的所有子元素,存取在List中
			List<Element> listElement=rootElement.elements();
			for (Iterator iterator = listElement.iterator(); iterator.hasNext();) {
				//获取每个student元素
				Element element = (Element) iterator.next();
				//获取student元素下的name、age、sex的元素的内容
				String name=element.elementText("name");
				String age=element.elementText("age");
				String sex=element.elementText("sex");
				System.out.println(name);
				System.out.println(age);
				System.out.println(sex);
			}
		} catch (FileNotFoundException | DocumentException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		test1();
	}
}


对比了一下,本人觉得JDOM 与DOM4J的解析过程极为形似,但DOM4J是由JDOM演变而来的,使得DOM4J的语言风格更容易让人理解接受,调用的方法名也比较好理解相对于JDOM。

还有就是,JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM.虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值