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

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

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

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

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Book>
        <name>偷影子的人</name>
        <author>马克李维</author>
        <year>2010</year>
    </Book>
    <Book>
        <name>人生不设限</name>
        <author>尼克胡哲</author>
        <year>2010</year>
    </Book>
</Root>

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

package com.minlz.xml;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * @author minliangzhi
 * @date 2016年9月7日
 */
public class DomParser {

    public static void main(String[] args) {
        /**
         * DOM 解析XML的一般步骤:工厂模式
         * 1、构建一个构造器工厂
         * 2、构建一个构造器
         * 3、使用构造器解析XML文件
         */
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = null;
        Document document = null;
        try {
            builder = factory.newDocumentBuilder();
            document = builder.parse("resources/books.xml");
        } catch (Exception e) {
            e.printStackTrace();
        }

        List<Book> allBook = new ArrayList<Book>();
        if (document != null) {
            /** 获取XML文件信息的数据根节点 */
            NodeList books = document.getElementsByTagName("Book");
            int bookCount = books.getLength();
            for (int i = 0; i < bookCount; i++) {
                /** 遍历每条数据记录 */
                Map<String, Object> att = new HashMap<String, Object>();
                NodeList properties = books.item(i).getChildNodes();
                int proCount = properties.getLength();
                for (int j = 0; j < proCount; j++) {
                    /** 遍历每条数据记录的所有属性 */
                    /** 注意,这里的proCount一共是7,因为它包括了节点与节点之间的空白部分,但实际我们处理的是ELEMENT_NODE */
                    Node node = properties.item(j);
                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                        att.put(node.getNodeName(), node.getFirstChild().getNodeValue());
                    }
                }
                Book book = buildObject(Book.class, att);
                allBook.add(book);
            }
            for(Book b : allBook) {
                System.out.println(b.toString());
            }
        }
    }

    private static <T> T buildObject(Class<T> clazz, Map<String, Object> attributes) {
        T t = null;
        try {
            /** 初始化一个实例 */
            t = clazz.newInstance();
            Field[] allFields = clazz.getDeclaredFields();
            /** 遍历所有属性,如果发现已经提供了属性的值,则设置该值 */
            for(Field f : allFields) {
                if(attributes.containsKey(f.getName())) {
                    f.setAccessible(true);
                    f.set(t, attributes.get(f.getName()));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } 

        return t;
    }
}

class Book {
    private String name;
    private String author;
    private String year;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public String getYear() {
        return year;
    }
    public void setYear(String year) {
        this.year = year;
    }
    @Override
    public String toString() {
        return "Book [name=" + name + ", author=" + author + ", year=" + year
                + "]";
    }
}

解析的结果:

Book [name=偷影子的人, author=马克李维, year=2010]
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. django rest framework 再撸体验

    曾经了解过. 放在一边,嫌麻烦. 如今身为leader,站在团队沟通的角度看看,还不错. 有几个优点: 1. api一览表 2. api web预览界面(类似.net的webservice预览界面), ...

  2. ffmpeg-201612[01,08,10,17,21,27,30]-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...

  3. Ruby字符串

    在Ruby中的String对象持有和操纵的任意序列的一个或多个字节,通常表示人类语言的字符表示.简单的字符串文本括在单引号中,如 'This is a simple Ruby string liter ...

  4. 把包发布到npm官网

    一.包 包就是多模块的集合,CommonJS的包规范给程序员提供了组织模块的标准,减少沟通成本. 规范: 所有的模块放在demo文件夹下(包名)的lib文件夹里面 在lib文件夹的同级目录下新建ind ...

  5. Linux系统开机默认开启无线网卡

    Linux系统每次重新启动时,不会重新打开无线网卡,需要每次手动去更改. 这里通过两种方式开启无线网卡. 第一种方式就是手动连接到Linux系统,(前提是按照了Linux桌面) 1.找到文件夹为 et ...

  6. 51nod1102(数塔)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1002 题意:中文题诶- 思路:简单dp 从底层往上递推,每个 ...

  7. JS中获得当前时间的年月

    //获取完整的日期 var date=new Date; var year=date.getFullYear(); var month=date.getMonth()+1; month =(month ...

  8. startUML破解方式

    StarUML官方下载地址:http://staruml.io/download StarUML是一个非常好用的画UML图的工具,但是它是收费软件​,以下是破解方法: ​1.使用Editplus或者N ...

  9. ExtJS 数据模型

    自定义数据模型 数据模型类其实就是一个继承自Ext.data.Model 的类. Ext.define('MyApp.User', { extend: 'Ext.data.Model', fields ...

  10. 高性能的JavaScript--数据访问(1)

    写在前面 数据存储在哪里,关系到代码运行期间数据被检索到的速度.在JavaScript中,此问题相对简单,因为数据存储只有少量方式可供选择.正如其他语言那样,数据存储位置关系到访问速度.在JavaSc ...