java使用DOM解析XML文件

JAVA解析XML通常有两种方式:DOM和SAX

DOM: Document Object Model (文档对象模型)

DOM的特性:
定义一组Java接口,基于对象,与语言和平台无关将XML文档表示为树,在内存中解析和存储XML文档,允许随机访问文档的不同部分。
DOM解析XMLDOM的优点,由于树在内存中是持久的,因此可以修改后更新。它还可以在任何时候在树中上下导航,API使用起来也较简单。

解析步骤:
1、创建解析器工厂对象
DocumentBuilderFactory builder = DocumentBuilderFactory.newlnstance();

2、创建解析器对象
DocumentBuilder db = builder.newDocumentBuilder();

3、读取文件到内存
db.parse(" person.xml");

4、从内存中读取数据
NodeList node_ person = doc.getElementsByTagName("person");

特点:
基于树型结构,通过解析器一次性把文档加载到内存中,所以会比较占用内存,可以随机访问,更加灵活,更适合在web开发中使用。

代码示例:

package com.booy;

import org.junit.jupiter.api.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;

public class DOMDemo  {
    @Test
    public void domParser(){
        //创建一个解析器工厂对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //创建一个解析器对象
        try {
            DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
            //解析文档
            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/booy/person.xml");
            //将文档加载到内存中,以树状结构存储
            Document doc = documentBuilder.parse(is);
            //从内存中读取数据
            NodeList personNodeList = doc.getElementsByTagName("person");
            ArrayList<Person> persons = new ArrayList<>();
            Person p;
            for (int i = 0; i <personNodeList.getLength() ; i++) {
                //取出集合里的对象
                Node personNode = personNodeList.item(i);
                p = new Person();
                //获取属性集合的personid名称的值
                String personid = personNode.getAttributes().getNamedItem("personid").getNodeValue();
                p.setPersonid(personid);
                //获取当前所有子节点,还是list集合
                NodeList childNodes = personNode.getChildNodes();
                for (int j = 0; j <childNodes.getLength() ; j++) {
                    Node node = childNodes.item(j);
                    //获取节点的名称
                    String nodeName = node.getNodeName();
                    if("name".equals(nodeName)){
                        p.setName(node.getFirstChild().getNodeValue());
                    }else if("address".equals(nodeName)){
                        p.setAddress(node.getFirstChild().getNodeValue());
                    }else if("tel".equals(nodeName)){
                        p.setTel(node.getFirstChild().getNodeValue());
                    }else if("fax".equals(nodeName)){
                        p.setFax(node.getFirstChild().getNodeValue());
                    }else if("email".equals(nodeName)){
                        p.setEmail(node.getFirstChild().getNodeValue());
                    }
                }
                persons.add(p);
            }
            System.out.println(Arrays.toString(persons.toArray()));

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

对象数据类:

package com.booy;

public class Person {
    private String personid;
    private String name;
    private String address;
    private String tel;
    private String fax;
    private String email;

    public String getPersonid() {
        return personid;
    }
    public void setPersonid(String personid) {
        this.personid = personid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getFax() {
        return fax;
    }
    public void setFax(String fax) {
        this.fax = fax;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Person{" +
                "personid='" + personid + '\'' +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", tel='" + tel + '\'' +
                ", fax='" + fax + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<people>
    <person personid="E01">
        <name>Tony Blair</name>
        <address>10 Downing Street, London, UK</address>
        <tel>(061) 98765</tel>
        <fax>(061) 98765</fax>
        <email>blair@everywhere.com</email>
    </person>
    <person personid="E02">
        <name>Bill Clinton</name>
        <address>White House, USA</address>
        <tel>(001) 6400 98765</tel>
        <fax>(001) 6400 98765</fax>
        <email>bill@everywhere.com</email>
    </person>
</people>

版权声明:本文为booy123原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。