首页 > 代码库 > JAVA中使用DOM解析XML文件

JAVA中使用DOM解析XML文件

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                + "]";    }}

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

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

 

最后:

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

 

JAVA中使用DOM解析XML文件