解析XML文件

  • XML语言简介

什么是XML语言?

可扩展标记语言,标准通用标记语言的子集,(Extensible Markup Language)简称XML。是一种用于标记电子文件使其具有结构性的标记语言。

可扩展:用户可以自定义标签

标记:<>标签,所有标签都写在<>中

XML是HTML语言扩充。

 

总结HTML语言和XML语言区别:

  1. HTML超文本标记语言,标签都是预先定义好的,XML语言可扩展标记语言,标签可以自定义。
  2. 设计目的不同,HTML主要用来显示数据内容;XML语言存储数据和传输数据。
  3. XML是HTML语言补充。

 

  • 解析XML文件

  1. 创建XML文件

<?xml version="1.0" encoding="UTF-8"?>

<school name="中公教育" address="五方桥基地" >

    <myclass cname="1008">

        <student>

            <sid>1000</sid>

            <sname>张三</sname>

            <sgender></sgender>

            <sage>23</sage>

        </student>

        <student>

            <sid>1001</sid>

            <sname>李四</sname>

            <sgender></sgender>

            <sage>24</sage>

        </student>

        <student>

            <sid>1002</sid>

            <sname>王五</sname>

            <sgender></sgender>

            <sage>25</sage>

        </student>

    </myclass>

    <myclass cname="1009">

        <student>

            <sid>2000</sid>

            <sname>小翠</sname>

            <sgender></sgender>

            <sage>23</sage>

        </student>

        <student>

            <sid>2001</sid>

            <sname>小红</sname>

            <sgender></sgender>

            <sage>21</sage>

        </student>

        <student>

            <sid>2002</sid>

            <sname>小明</sname>

            <sgender></sgender>

            <sage>22</sage>

        </student>

    </myclass>

</school>

XML文件需要注意的问题:

  1. 根标签只能有一对
  2. 标签要成对出现
  3. 标签中属性的值放在双引号中写
  4. 标签严格区分大小写
  5. 标签要正确嵌套

 

2.XML解析(读取)

    1).dom4j

    a.下载dom4j的jar包并添加到项目中构建路径

 

     b.编写代码解析XML文件

        1.创建SAXReader对象

               SAXReader reader=new SAXReader();

       2.使用SAXReader对象的read()方法加载XML文件,并获取Document文档对象

               Document document = reader.read(new FileInputStream("school.xml"));

       3.获取根节点,不管是根节点还是子节点,所有节点的类型都是Element类型

               Element rootElement = document.getRootElement();

       4.获取子节点并循环遍历

            List<Element> elements = rootElement.elements();

 

针对节点操作常用方法:

  1. 获取节点的属性值

节点对象.attributeValue("属性名");

  1. 获取节点名

节点对象.getName();

  1. 获取节点中间的文本信息

节点对象.getText();

特殊方法:通过父节点对象直接获取子点节间的文本信息

父节点对象.elementText(“子节点名”);

案例参考代码:

package com.offcn.dom4j;

 

import java.io.FileInputStream;

import java.util.ArrayList;

import java.util.List;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

import org.junit.Test;

import com.offcn.entity.Student;

 

public class TestDom4j {

    @Test

    public void test01() {

        //1.创建SAXReader对象

        SAXReader reader=new SAXReader();

        try {

            //2.使用SAXReader对象的read()方法加载XML文件并获取文档对象Document

            Document document = reader.read(new FileInputStream("school.xml"));

            //3.*******获取根节点,不管是根节点还是子节点,所有节点的类型都是Element类型

            //rootElement---->school

            Element rootElement = document.getRootElement();

            //获取节点的属性值:节点对象.attributeValue("属性名")

            System.out.println("学校名称:"+rootElement.attributeValue("name"));

            System.out.println("学校地址:"+rootElement.attributeValue("address"));

            System.out.println("-------------------------------------------------");

            //4.获取并遍历子节点

            List<Element> elements = rootElement.elements();

            for (Element myclass : elements) {

                //获取当前班级节点的属性值:班级名称

                System.out.println(myclass.attributeValue("cname"));

                //获取并遍历子节点

                List<Element> students = myclass.elements();

                for (Element stu : students) {

                    //获取并遍历子节点

                    List<Element> elms = stu.elements();

                    for (Element elm : elms) {

                        //获取节点名和值

                        //System.out.println(elm.getName()+":"+elm.getText());

                        switch (elm.getName()) {

                        case "sid":

                            System.out.println("学号:"+elm.getText());

                            break;

                        case "sname":

                            System.out.println("姓名:"+elm.getText());

                            break;

                        case "sgender":

                            System.out.println("性别:"+elm.getText());

                            break;

                        case "sage":

                            System.out.println("年龄:"+elm.getText());

                            break;

                        }

                    }

                    System.out.println();

                }

                System.out.println("*****************************************");

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

   

    //解析XML文件

    public List<Student> loadXml() {

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

        //1.创建SAXReader对象

        SAXReader reader=new SAXReader();

        try {

            //2.使用SAXReader对象的read()方法加载XML文件并获取文档对象Document

            Document document = reader.read(new FileInputStream("school.xml"));

            //3.*******获取根节点,不管是根节点还是子节点,所有节点的类型都是Element类型

            //rootElement---->school

            Element rootElement = document.getRootElement();

            //获取节点的属性值:节点对象.attributeValue("属性名")

            System.out.println("学校名称:"+rootElement.attributeValue("name"));

            System.out.println("学校地址:"+rootElement.attributeValue("address"));

            System.out.println("-------------------------------------------------");

            //4.获取并遍历子节点

            List<Element> elements = rootElement.elements();

            for (Element myclass : elements) {

                //获取当前班级节点的属性值:班级名称

                System.out.println(myclass.attributeValue("cname"));

                //获取并遍历子节点

                List<Element> students = myclass.elements();

                for (Element stu : students) {

                    /*

                     * //获取并遍历子节点 List<Element> elms = stu.elements(); for (Element elm : elms) {

                     * //获取节点名和值 //System.out.println(elm.getName()+":"+elm.getText()); switch

                     * (elm.getName()) { case "sid": System.out.println("学号:"+elm.getText()); break;

                     * case "sname": System.out.println("姓名:"+elm.getText()); break; case "sgender":

                     * System.out.println("性别:"+elm.getText()); break; case "sage":

                     * System.out.println("年龄:"+elm.getText()); break; } }

                     */

                    /*

                     * System.out.println("学号:"+stu.elementText("sid"));

                     * System.out.println("姓名:"+stu.elementText("sname"));

                     * System.out.println("性别:"+stu.elementText("sgender"));

                     * System.out.println("年龄:"+stu.elementText("sage"));

                     */

                    Student student=new Student(Integer.valueOf(stu.elementText("sid")), stu.elementText("sname"), stu.elementText("sname"), Integer.valueOf(stu.elementText("sage")));

                    //将封装好的对象添加到集合中

                    list.add(student);

                }

                System.out.println("*****************************************");

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

        return list;

    }

   

    @Test

    public void showStudent() {

        List<Student> list = loadXml();

        for (Student student : list) {

            System.out.println(student);

        }

    }

}

 

2).xpath:可以直接指定要获取的节点

   A.下载xpath的jar包并添加到项目中构建路径

 

B.编写代码解析xml文件,步骤同dom4j,可以直接指定节点路径

完整参考代码如下:

package com.offcn.dom4j;

 

import java.io.FileInputStream;

import java.util.ArrayList;

import java.util.List;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

import org.junit.Test;

import com.offcn.entity.Student;

public class TestXPath {

    // 查询学生的姓名

    @Test

    public void test01() {

        // 1.创建SAXReader对象

        SAXReader reader = new SAXReader();

        try {

            // 2.使用SAXReader对象的read()方法加载XML文件并获取document对象

            Document document = reader.read(new FileInputStream("school.xml"));

            // 3.直接指定要查找的节点路径

            List<Element> selectNodes = document.selectNodes("//sname");

            // selectNodes----sname

            // List<Element> selectNodes =

            // document.selectNodes("/school/myclass/student/sname");

            // 4.遍历查找到的节点信息

            for (Element element : selectNodes) {

                System.out.println(element.getName() + ":" + element.getText());

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

 

    // 查询所有学生的基本信息

    @Test

    public void test02() {

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

        // 1.创建SAXReader对象

        SAXReader reader = new SAXReader();

        try {

            // 2.使用SAXReader对象的read()方法加载XML文件并获取document对象

            Document document = reader.read(new FileInputStream("school.xml"));

            // 3.直接指定要查找的节点路径

            List<Element> selectNodes = document.selectNodes("//student");

            // selectNodes----sname

            // List<Element> selectNodes =

            // document.selectNodes("/school/myclass/student/sname");

            // 4.遍历查找到的节点信息

            for (Element element : selectNodes) {

                Student student=new Student(Integer.valueOf(element.elementText("sid")),

                        element.elementText("sname"), element.elementText("sgender"),

                        Integer.valueOf(element.elementText("sage")));

                list.add(student);

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

        //显示学生信息

        for (Student student : list) {

            System.out.println(student);

        }

    }

}

 

 

注意路径的指定方式:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值