什么是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的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。