【XML和Java】Java程序+SAX对XML的解析输出

XML的解析

对xml文件进行操作,包括创建xml,对xml文件进行增删改查操作

常见的xml解析技术

  • DOM解析:由官方提供,基于xml树。耗资源多,适用于多次访问

  • SAX解析:由民间提供,基于事件。耗资源少,使用于大量数据

  • JDOM解析:由第三方提供,开源免费。比DOM解析快

  • DOM4J(DOM for Java):由第三方提供,是JDOM的升级版

准备好相应的xml文件

在项目下的 src/main/resourse 路径下准备好xml文件,以下是示例:

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

<!-- 声名内部DTD -->
<!DOCTYPE scores [
	<!ELEMENT scores (student*) >
    <!ELEMENT student (name, course, score) >
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT course (#PCDATA)>
    <!ELEMENT score (#PCDATA)>
    <!ATTLIST student id CDATA #REQUIRED>
]>

<scores>
    <student id="1">
        <name>王同</name>
        <course>java</course>
        <score>89</score>
    </student>
    <student id="2">
        <name>李佳</name>
        <course>sql</course>
        <score>58</score>
    </student>
    <student id="3">
        <name>张三</name>
        <course>fata</course>
        <score>80</score>
    </student>
</scores>

基于SAX技术的Java程序

编写Java代码,将scores.xml中的数据读取出来

XmlHandler.java

作用:被XmlParser.java中的parse调用读取xml的数据

package cn.edu.lingnan.util;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.HashMap;
import java.util.Map;

//这个类是DefaultHandler的子类,我们只需要写我们需要的方法即可
public class XmlHandler extends DefaultHandler {

    StringBuffer stringBuffer = new StringBuffer();
    Map<String,String> map = new HashMap<String,String>();

    public Map<String, String> getMap() {
        return map;
    }

    //初始化,清空字符串
    public void startElement (String uri, String localName,
                              String qName, Attributes attributes)
            throws SAXException
    {
        stringBuffer.delete(0,stringBuffer.length());
    }


    //把元素名和内容以键值对的形式存入HashMap对象
    public void endElement (String uri, String localName, String qName)
            throws SAXException
    {
        map.put(qName.toLowerCase(),stringBuffer.toString());
    }


    //明确一下,这方法是自动调用的,传过来的参数是有内容的
    //我们要做的事情是把读到的内容记录下来
    public void characters (char ch[], int start, int length)
            throws SAXException
    {
        stringBuffer.append(ch,start,length);
    }
}

Xmlparser.java

作用:传入xml的地址,即可在该程序中由SAXParserFactory对象调用parse方法解析xml文件

package cn.edu.lingnan.util;

import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class XmlParser {
    //解析xml文件
    public static Map<String,String> parse(String xmlPath){
        Map<String,String> map = new HashMap<String,String>();
        try {
            //1.实例化一个SAXParserFactory对象
            SAXParserFactory factory = SAXParserFactory.newInstance();
            //2.通过factory获得一个SAXParser对象,即SAX解析器
            SAXParser saxParser = factory.newSAXParser();
            //3.SAXParserFactory对象调用parse方法解析xml文件
            File file = new File(xmlPath);
            XmlHandler xmlHandler = new XmlHandler();
            saxParser.parse(file,xmlHandler);

            map=xmlHandler.getMap();
            
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return map;
    }
}

xml文件解析的用处

xml文件可以用来存放数据库连接必要的信息。程序员可以通过解析该xml文件得到数据库连接的必要信息,并且在后期更改数据库连接时也能更方便,增强程序的可读性。

package cn.edu.lingnan.util;

import java.sql.*;
import java.util.Map;

//功能,处理数据库连接,作成单例模式
public class DBConnection {
    private static String dirver = null;
    private static String url = null;
    private static String user = null;
    private static String password = null;
    private static String  xsdName = "database.conf.xsd";
    private static String  xmlName = "database.conf.xml";

    private static DBConnection dbConnection = null;
    private Connection conn = null;

    static {
        String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); //得到当前线程运行的路径
        String xsdPath = basePath+xsdName;
        String xmlPath = basePath+xmlName;
        if (XmlVlidate.validate(xsdPath,xmlPath)) {
            Map<String, String> map = XmlParser.parse(xmlPath);
            dirver = map.get("driver");
            url = map.get("url");
            user = map.get("user");
            password = map.get("password");
        }
    }

    //私有的构造方法,保证对象的唯一性
    private DBConnection(){
        try {
            //1 注册驱动程序
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("[Debug] mysql的jar驱动下载失败... ...");
            e.printStackTrace();
        }
    }

    //静态工厂方法
    public static DBConnection getInstance(){
        if(dbConnection == null)
            dbConnection = new DBConnection();
        return dbConnection;
    }

    //获取数据库连接
    public Connection getConnection(){
        try {
            //2 获取数据库连接,如果是mysql8.0的还要加SSL和ZONE的设置
            conn = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    public void closeConnection(Connection conn, Statement stat, ResultSet rs){
        try {
            if(rs != null) {
                rs.close();
            }
            if (stat != null) {
                stat.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void closeConnection(Connection conn, PreparedStatement prep, ResultSet rs){
        try {
            if(rs != null) {
                rs.close();
            }
            if (prep != null) {
                prep.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void closeConnection(Connection conn, PreparedStatement prep){
        try {
            if (prep != null) {
                prep.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

//    //获取数据库连接方法 1.0
//    public static Connection getConnection(){
//        Connection conn = null;
//        try {
//            //1 注册驱动程序
//            Class.forName("com.mysql.jdbc.Driver");
//            //2 获取数据库连接,如果是mysql8.0的还要加SSL和ZONE的设置
//            conn = DriverManager.getConnection
//                    ("jdbc:mysql://localhost:3306/java_test?characterEncoding=UTF8&useUnicode=true&useSSL=false","root","200153");
//        } catch (SQLException | ClassNotFoundException e) {
//            e.printStackTrace();
//        }
//
//        return conn;
//    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peng_YuJun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值