java解析xml文件

1.解析xml這里我用兩種方式來(lái)實(shí)行,一種是jdk自帶的,二種是用Dom4j來(lái)解析

2.環(huán)境配置

(1)這里我是用maven項(xiàng)目,它是pom.xml依賴(lài)如下:

 <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
    </dependencies>

(2)再創(chuàng)建一個(gè)stus.xml文件,和pom.xml文件是平級(jí)的,內(nèi)容如下:

<students>
    <student>
        <sid>1</sid>
        <name>huhoujun</name>
        <addr>xian</addr>
    </student>
    <student>
        <sid>2</sid>
        <name>lishushu</name>
        <addr>beijing</addr>
    </student>
    <student>
        <sid>3</sid>
        <name>chenggang</name>
        <addr>shenzhen</addr>
    </student>
    <student>
        <sid>4</sid>
        <name>liaozizhong</name>
        <addr>guangzhou</addr>
    </student>
    <student>
        <sid>5</sid>
        <name>dengweida</name>
        <addr>guangzhou</addr>
    </student>
    <student>
        <sid>6</sid>
        <name>xiaodechao</name>
        <addr>dalian</addr>
    </student>
</students>

(3)再創(chuàng)建一個(gè)實(shí)體類(lèi),Student.java

package com.it.entity;

import lombok.Data;

@Data
public class Student {
    private int sid;
    private String name;
    private String addr;
}

3.下面是第一種方式來(lái)解析xml

測(cè)試代碼如下:

package com.it.test;

import com.it.entity.Student;
import org.junit.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.util.ArrayList;
import java.util.List;

public class XmlTest {
    public List<Student> parseXml(String xmlFile){

        List<Student> list = new ArrayList<>();

        //  1.  創(chuàng)建DocumentBuilderFactory對(duì)象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();


        try {
            //  2.  使用DocumentBuilderFactory對(duì)象的newDocumentBuilder()方法創(chuàng)建一個(gè)DocumentBuilder對(duì)象
            DocumentBuilder builder = dbf.newDocumentBuilder();

            //  3.  使用DocumentBuilder的parse(file)方法來(lái)對(duì)于指定文件來(lái)進(jìn)行解析,得到一個(gè)document對(duì)象
            Document document = builder.parse(xmlFile);

            //  4.  通過(guò)document對(duì)象的getElementsByTagName(tagName)來(lái)獲取指定標(biāo)簽的節(jié)點(diǎn)
            NodeList nodeList = document.getElementsByTagName("student");

            Student stu = null;
            for (int i = 0; i < nodeList.getLength(); i++) {
                stu = new Student();

                Node node = nodeList.item(i);

                NodeList nodes = node.getChildNodes();

                //  遍歷每個(gè)student節(jié)點(diǎn)中的每個(gè)sid,name,addr節(jié)點(diǎn)
                for (int j = 0; j < nodes.getLength(); j++) {
                    Node item = nodes.item(j);

                    //System.out.println(item);

                    switch (item.getNodeName()){
                        case "sid":
                            String ssid = item.getTextContent();

                            int sid = ssid == null ? 0 : Integer.parseInt(ssid);

                            stu.setSid(sid);

                            break;
                        case "name":
                            String name = item.getTextContent();

                            stu.setName(name);

                            break;
                        case "addr":
                            String addr = item.getTextContent();

                            stu.setAddr(addr);

                            break;
                    }
                }

                list.add(stu);
            }

            //System.out.println(document);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return list;
    }
    @Test
    public void testStudent1(){
        List<Student> students = parseXml("stus.xml");
        for (Student student : students) {
            System.out.println(student);

        }
    }
}

測(cè)試解果如下:

Student(sid=1, name=huhoujun, addr=xian)
Student(sid=2, name=lishushu, addr=beijing)
Student(sid=3, name=chenggang, addr=shenzhen)
Student(sid=4, name=liaozizhong, addr=guangzhou)
Student(sid=5, name=dengweida, addr=guangzhou)
Student(sid=6, name=xiaodechao, addr=dalian)

4.第二種Dom4j方式解析xml

package com.it.test;

import com.it.entity.Student;
import org.dom4j.Document;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import org.xml.sax.SAXException;

import java.util.ArrayList;
import java.util.List;

public class Dom4jTest {
    public List<Student> parseXml(String xmlFile){
        List<Student> stus = new ArrayList<>();
        try {
            // 1.創(chuàng)建SAXReader對(duì)象
            SAXReader reader = new SAXReader();
            // 2.使用SAXReader對(duì)象讀取給定的xml文件得到一個(gè)Document對(duì)象
            Document document = reader.read(xmlFile);
            // 3.通過(guò)Document對(duì)象的getRootElement()方法得到xml的跟節(jié)點(diǎn)元素
            Element root = document.getRootElement();
            // 4.通過(guò)root("根元素")順藤摸瓜找到所有的子元素節(jié)點(diǎn)
            List<Element> elements = root.elements();
            Student student = null;
            for (Element e1 : elements) {
                List<Element> elements1 = e1.elements();
                student = new Student();
                for (Element e2 : elements1) {
                    switch (e2.getName()){
                        case "sid":
                            String ssid = e2.getText();
                            int sid = ssid == null ? 0 : Integer.parseInt(ssid);
                            student.setSid(sid);
                            break;
                        case "name":
                            String name = e2.getText();

                            student.setName(name);
                            break;
                        case "addr":
                            String addr = e2.getText();

                            student.setAddr(addr);
                            break;
                    }
                }
                stus.add(student);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return stus;
    }


    @Test
    public void testStudent1(){
        List<Student> students = parseXml("stus.xml");
        for (Student student : students) {
            System.out.println(student);

        }
    }
}

它的測(cè)試結(jié)果和上面的一樣

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容