您的位置:首页 > 编程语言 > Java开发

Java文件操作①——XML文件的读取

2016-07-12 15:00 525 查看

一、邂逅XML

文件种类是丰富多彩的,XML作为众多文件类型的一种,经常被用于数据存储和传输。所以XML在现今应用程序中是非常流行的。本文主要讲Java解析和生成XML。用于不同平台、不同设备间的数据共享通信。

XML文件的表现:以“.xml”为文件扩展名的文件;

   存储结构:树形结构;



SAX解析开始
======================开始遍历第1本书的内容=================
book元素的第1个属性名是:id---属性值是:1
节点名是:name---节点值是:冰与火之歌
节点名是:author---节点值是:乔治马丁
节点名是:year---节点值是:2014
节点名是:price---节点值是:89
======================结束遍历第1本书的内容=================
======================开始遍历第2本书的内容=================
book元素的第1个属性名是:id---属性值是:2
节点名是:name---节点值是:安徒生童话
节点名是:year---节点值是:2004
节点名是:price---节点值是:77
节点名是:language---节点值是:English
======================结束遍历第2本书的内容=================
SAX解析结束
~~~~~共有2本书
1
冰与火之歌
乔治马丁
2014
89
null
----finish----
2
安徒生童话
null
2004
77
English
----finish----


View Code

四、[b]应用 DOM4J 及 JDOM 方式解析 XML

# JDOM 方式解析 XML

  JDOM 开始解析前的准备工作:

  JDOM是第三方提供的解析XML方法,需要jdom-2.0.5.jar包





示例代码:

package com.study.jdomtest1.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

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

import com.study.jdomtest1.entity.Book;

/**
*  JDOM 解析XML
*/
public class JDOMTest {
private static ArrayList<Book> booksList = new ArrayList<Book>();

public static void main(String[] args) {
// 进行对books.xml文件的JDOM解析
//❤准备工作
// 1.创建一个SAXBuilder的对象
SAXBuilder saxBuilder = new SAXBuilder();//注意SAXBuilder是org.jdom2.input包下的
InputStream in;
try {
// 2.创建一个输入流,将xml文件加载到输入流中
in=new FileInputStream("books.xml");//如果将xml文件放在src/res包下,此时应该输入“src/res/books.xml”
InputStreamReader isr = new InputStreamReader(in, "UTF-8");//使用包装流InputStreamReader进行读取编码的指定,防止乱码
// 3.通过saxBuilder的build方法,将输入流加载到saxBuilder中
Document document = saxBuilder.build(isr);
// 4.通过document对象获取xml文件的根节点
Element rootElement = document.getRootElement();
// 5.获取根节点下的子节点的List集合
List<Element> bookList = rootElement.getChildren();
//❤ 继续解析,采用for循环对bookList进行遍历
for (Element book : bookList) {
Book bookEntity = new Book();
System.out.println("======开始解析第" + (bookList.indexOf(book) + 1) + "书======");//indexOf()返回的是index的位置,是从0开始
// 解析book的属性集合
List<Attribute> attrList = book.getAttributes();//适用于未知属性情况下
/*//知道节点下属性名称时,获取节点值
book.getAttributeValue("id");*/
// 遍历attrList(针对不清楚book节点下属性的名字及数量)
for (Attribute attr : attrList) {
/**注:JDom中,Attribute的getName和getValue方法获取到的都是实际的名称和值,
* 不会出现SAX和DOM中的空格和换行的情况*/
// 获取属性名
String attrName = attr.getName();
// 获取属性值
String attrValue = attr.getValue();
System.out.println("属性名:" + attrName + "----属性值:" + attrValue);
if (attrName.equals("id")) {
bookEntity.setId(attrValue);
}
}

//❤对book节点的子节点的节点名以及节点值的遍历
List<Element> bookChilds = book.getChildren();
for (Element child : bookChilds) {
System.out.println("节点名:" + child.getName() + "----节点值:" + child.getValue());
if (child.getName().equals("name")) {
bookEntity.setName(child.getValue());
}
else if (child.getName().equals("author")) {
bookEntity.setAuthor(child.getValue());
}
else if (child.getName().equals("year")) {
bookEntity.setYear(child.getValue());
}
else if (child.getName().equals("price")) {
bookEntity.setPrice(child.getValue());
}
else if (child.getName().equals("language")) {
bookEntity.setLanguage(child.getValue());
}

}
System.out.println("======结束解析第" + (bookList.indexOf(book) + 1) + "书======");
booksList.add(bookEntity);
bookEntity = null;
//测试数据
System.out.println(booksList.size());
System.out.println(booksList.get(0).getId());
System.out.println(booksList.get(0).getName());

}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}


注意:

❤关于 JDOM 使用过程中 JAR 包的引用 :

方式1:通过右击项目-->build path-->add external archives...-->然后选择本地文件的jar包
这种方式并不能将jar包真正导入到项目源码中,当把项目导出放在另外的机器上,这个jar包并不会随着project一同被导出。

如图:



方式2:项目根目录下新建lib文件夹——复制、粘帖jar包——右击jar包选择“build path构建路径”——“add to build path添加至构建路径”即可

如图:



# DOM4J 方式解析 XML

  DOM4J 是第三方提供的解析XML方法,需要dom4j-1.6.1.jar包

示例:

package com.study.dom4jtest;

import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
* DOM4J 方式解析XML
*/
public class DOM4JTest {

public static void main(String[] args) {
// 解析books.xml文件
// 创建SAXReader的对象reader
SAXReader reader = new SAXReader();
try {
// 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
Document document = reader.read(new File("books.xml"));
// 通过document对象获取根节点bookstore
Element bookStore = document.getRootElement();
// 通过element对象的elementIterator方法获取迭代器
Iterator it = bookStore.elementIterator();
// 遍历迭代器,获取根节点中的信息(书籍)
while (it.hasNext()) {
System.out.println("=====开始遍历某一本书=====");
Element book = (Element) it.next();
// 获取book的属性名以及 属性值
List<Attribute> bookAttrs = book.attributes();
for (Attribute attr : bookAttrs) {
System.out.println("属性名:" + attr.getName() + "--属性值:" + attr.getValue());
}
//解析子节点的信息
Iterator itt = book.elementIterator();
while (itt.hasNext()) {
Element bookChild = (Element) itt.next();
System.out.println("节点名:" + bookChild.getName() + "--节点值:" + bookChild.getStringValue());
}
System.out.println("=====结束遍历某一本书=====");
}

} catch (DocumentException e) {
e.printStackTrace();
}
}

}


五、四种解析方式比较分析

基础方法:DOM(平台无关的官方解析方式)、SAX(基于事件驱动的解析方式)
扩展方法:JDOM、DOM4J(在基础的方法上扩展出的,只有在java中能够使用的解析方法)













##解析速度的分析





XML四种解析方式性能测试:
SAX>DOM>DOM4J>JDOM

JUnit是Java提供的一种进行单元测试的自动化工具。测试方法可以写在任意类中的任意位置。使用JUnit可以没有main()入口进行测试。
DOM4J在灵活性和对复杂xml的支持上都要强于DOM
DOM4J的应用范围非常的广,例如在三大框架的Hibernate中是使用DOM4J的方式解析文件的。
DOM是w3c组织提供的一个官方解析方式,在一定程度上是有所应用的。
当XML文件比较大的时候,会发现DOM4J比较好用
1.JUnit:Java提供的单元测试;@Test注解;采用JUnit不需要程序入口main方法
2.性能测试结果:几kB的xml文件;建议使用DOM4J解析
  DOM-33ms
  SAX-6ms
  JDOM-69ms
  DOM4J-45ms
工程右键build path --Add library--JUnit单元测试 --version:JUnit4
  DOM:33,SAX:6
  JDOM:69;DOM4J:45
  DOM 有可能溢出
多使用DOM4J
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: