JAVA中使用DOM解析XML文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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文件的主要内容,如果未能解决你的问题,请参考以下文章

java代码用dom4j解析xml文件的简单操作

Java里面怎么解析xml文件的内容

Java web——xml文件读取的解析方式(DOM和SAX)

在java中解析xml有哪几种方法

JAVA中使用DOM解析XML文件

Android之DOM解析XML