【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;
// }