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 方式解析 XMLJDOM 开始解析前的准备工作:
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
相关文章推荐
- 20160625-20160712完成的功能需求以及解决的问题总结
- spring aop 拦截实现日志管理
- JAVA8之初见
- Java JList用法二
- 《JAVA中的二进制》
- SpringMVC 返回String中文乱码
- JDK1.5之后怎么玩转多线程(Lock和Condition的使用)
- 【SpringMVC框架】小结+视图解析器配置前缀和后缀
- Json学习总结(2)——Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP
- Json学习总结(2)——Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP
- Java编写激活邮件
- Spring-5:Bean之间的继承与依赖
- openfire src Ant 时报错 javac: 无效的目标版本: 1.7
- 【SpringMVC框架】注解的处理器映射器和适配器配置
- Cognos由于JAVA_HOME冲突引起的错误假象
- 【SpringMVC框架】非注解的处理器映射器和适配器
- spring配置必须声明元素类型 "context:component-scan"。
- 从JSP页面里传数据到SpringMVC中的Controller处理
- java中的三种取整函数
- 将数据导出到Excel(java操作Excel)