XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式。因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看。

JAVA作为一种高级语言,具备多种方法解析XML文件,诸如DOM, SAX,另外还有DOM4J等框架可供使用,本篇使用一个具体的例子,简单介绍通过DOM来解析一个XML文件的过程。

DOM解析基于文档格式,我们在前台编程中也会遇见这种说法,他就是“文档对象模型”,我们把XML看成是一颗倒立的树结构,基于此来解析文档。

上例子,提供的XML文件,包含了两本书的信息,我们需要解析出来,并转换为对应的JAVA实例对象!

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Root>
  3. <Book>
  4. <name>偷影子的人</name>
  5. <author>马克李维</author>
  6. <year>2010</year>
  7. </Book>
  8. <Book>
  9. <name>人生不设限</name>
  10. <author>尼克胡哲</author>
  11. <year>2010</year>
  12. </Book>
  13. </Root>

我们可以看见,每本书包括三个属性,那么对应的解析代码为:

  1. package com.minlz.xml;
  2.  
  3. import java.lang.reflect.Field;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8.  
  9. import javax.xml.parsers.DocumentBuilder;
  10. import javax.xml.parsers.DocumentBuilderFactory;
  11.  
  12. import org.w3c.dom.Document;
  13. import org.w3c.dom.Node;
  14. import org.w3c.dom.NodeList;
  15.  
  16. /**
  17. * @author minliangzhi
  18. * @date 2016年9月7日
  19. */
  20. public class DomParser {
  21.  
  22. public static void main(String[] args) {
  23. /**
  24. * DOM 解析XML的一般步骤:工厂模式
  25. * 1、构建一个构造器工厂
  26. * 2、构建一个构造器
  27. * 3、使用构造器解析XML文件
  28. */
  29. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  30. DocumentBuilder builder = null;
  31. Document document = null;
  32. try {
  33. builder = factory.newDocumentBuilder();
  34. document = builder.parse("resources/books.xml");
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38.  
  39. List<Book> allBook = new ArrayList<Book>();
  40. if (document != null) {
  41. /** 获取XML文件信息的数据根节点 */
  42. NodeList books = document.getElementsByTagName("Book");
  43. int bookCount = books.getLength();
  44. for (int i = 0; i < bookCount; i++) {
  45. /** 遍历每条数据记录 */
  46. Map<String, Object> att = new HashMap<String, Object>();
  47. NodeList properties = books.item(i).getChildNodes();
  48. int proCount = properties.getLength();
  49. for (int j = 0; j < proCount; j++) {
  50. /** 遍历每条数据记录的所有属性 */
  51. /** 注意,这里的proCount一共是7,因为它包括了节点与节点之间的空白部分,但实际我们处理的是ELEMENT_NODE */
  52. Node node = properties.item(j);
  53. if (node.getNodeType() == Node.ELEMENT_NODE) {
  54. att.put(node.getNodeName(), node.getFirstChild().getNodeValue());
  55. }
  56. }
  57. Book book = buildObject(Book.class, att);
  58. allBook.add(book);
  59. }
  60. for(Book b : allBook) {
  61. System.out.println(b.toString());
  62. }
  63. }
  64. }
  65.  
  66. private static <T> T buildObject(Class<T> clazz, Map<String, Object> attributes) {
  67. T t = null;
  68. try {
  69. /** 初始化一个实例 */
  70. t = clazz.newInstance();
  71. Field[] allFields = clazz.getDeclaredFields();
  72. /** 遍历所有属性,如果发现已经提供了属性的值,则设置该值 */
  73. for(Field f : allFields) {
  74. if(attributes.containsKey(f.getName())) {
  75. f.setAccessible(true);
  76. f.set(t, attributes.get(f.getName()));
  77. }
  78. }
  79. } catch (Exception e) {
  80. e.printStackTrace();
  81. }
  82.  
  83. return t;
  84. }
  85. }
  86.  
  87. class Book {
  88. private String name;
  89. private String author;
  90. private String year;
  91. public String getName() {
  92. return name;
  93. }
  94. public void setName(String name) {
  95. this.name = name;
  96. }
  97. public String getAuthor() {
  98. return author;
  99. }
  100. public void setAuthor(String author) {
  101. this.author = author;
  102. }
  103. public String getYear() {
  104. return year;
  105. }
  106. public void setYear(String year) {
  107. this.year = year;
  108. }
  109. @Override
  110. public String toString() {
  111. return "Book [name=" + name + ", author=" + author + ", year=" + year
  112. + "]";
  113. }
  114. }

解析的结果:

  1. Book [name=偷影子的人, author=马克李维, year=2010]
  2. Book [name=人生不设限, author=尼克胡哲, year=2010]

熟悉HTML或者JS的朋友可能会容易看出中间解析的那部分逻辑,具体的DOM结构还有很多种类和属性,在此不一一介绍,只要熟悉了这个过程和模式,以后多看文档多记忆就会慢慢熟悉,不必一次性背诵所有的规则,善用才是最重要的。

代码中,有一个方法叫做“buildObject”,这里使用了反射知识来根据提供的属性集合构建实例,不熟悉的可以看看反射相关知识。

最后:

如有错误,还请指正,不胜感激!

 

JAVA中使用DOM解析XML文件的更多相关文章

  1. java中采用dom4j解析xml文件

    一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...

  2. java中利用dom4j解析XML文件

    官网下载Dom4j地址:https://dom4j.github.io/ 注意:使用Dom4j开发,需下载dom4j相应的jar文件 题目:后台利用dom4j解析student.xml文件,并返回Li ...

  3. Qt中使用DOM解析XML文件或者字符串二(实例)

    介绍 在Qt中提供了QtXml模块实现了对XML数据的处理,我们在Qt帮助中输入关键字QtXml Module,可以看到该模块的类表.在这里我们可以看到所有相关的类,它们主要是服务于两种操作XML文档 ...

  4. Java中实现SAX解析xml文件到MySQL数据库

    大致步骤: 1.Java bean 2.DBHelper.java 3.重写DefaultHandler中的方法:MyHander.java 4.循环写数据库:SAXParserDemo.java ① ...

  5. Qt中使用DOM解析XML文件或者字符串(实例)

    因为需要读取配置文件,我的配置文件采用xml:因此编写了使用qt读取xml文件内容的代码,xml文件如下: <?xml version="1.0" encoding=&quo ...

  6. JAVA中使用Dom解析XML

    在G盘下新建XML文档:person.xml,XML代码: <?xml version="1.0" encoding="utf-8"?> <s ...

  7. 转:在java中使用dom4j解析xml

    JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...

  8. 使用DOM解析xml文件

    使用DOM解析xml文件 要解析的xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <Langu ...

  9. DOM解析XML文件例子

    DOM解析XML文件是一次性将目标文件中的所有节点都读入,然后再进行后续操作的方式. 一般分为以下几步: 1. 定义好目标XML文件路径path . 2. 实例化DOM解析工厂对象 ,Document ...

随机推荐

  1. scrapy加载cookies登陆

    import scrapy from xxxx.items import XXXXItem from scrapy.http.request import Request class ZndsSpid ...

  2. 不得不说的wepapi 优化

    1:在你的ASP.NET Web API中使用GZIP 或 Deflate .对于减少响应包的大小和响应速度,压缩是一种简单而有效的方式.这是一个非常有必要使用的功能,你可以查看更多关于压缩的文章在我 ...

  3. Reverse Core 第二部分 - 13章 - PE文件格式

    @date: 2016/11/24 @author: dlive ​ PE (portable executable) ,它是微软在Unix平台的COFF(Common Object File For ...

  4. cxf webservice 生成wsdl方法参数名称为arg0问题

    在通过cxf生成webservice服务时,如果你是用ServerFactoryBean,那么在生成wsdl时,方法的参数名称会被自动命名为arg0,arg1...,如: <xsd:comple ...

  5. 相机变换与Ray-Casting

    p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify; orphans: 0; widows ...

  6. ionic使用方法

    windows下安装配置 npm install -g ionic npm install -g cordova ionic start myproject cd myproject ionic pl ...

  7. SQLServer

    # 将检索到的数据插入到一张新表 SELECT * INTO <NEW_TABLE_NAME> FROM <OLD_TABLE_NAME>

  8. 谈谈SQL 语句的优化技术

    https://blogs.msdn.microsoft.com/apgcdsd/2011/01/10/sql-1/ 一.引言 一个凸现在很多开发者或数据库管理员面前的问题是数据库系统的性能问题.性能 ...

  9. JAVA语言搭建白盒静态代码、黑盒网站插件式自动化安全审计平台

    近期打算做一个插件化的白盒静态代码安全审计自动化平台和黑盒网站安全审计自动化平台.现在开源或半开源做黑盒网站安全扫描的平台,大多是基于python脚本,安全人员贡献python脚本插件增强平台功能.对 ...

  10. Spring集成JUnit测试

    1.程序中有Junit环境2.导入一个jar包.spring与junit整合jar包 spring-test-3.2.0.RELEASE.jar3.测试代码 @RunWith(SpringJUnit4 ...