xml文档解析2019-9-23

4种文档解析

xml解析 可以对框架 的一些内部实现

解析一样读取任意节点,

有 4种:

1.DOM解析(Document Object Model)

DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取和操作文档的任意部分,是W3C的官方标准dom( document) 将整个文档解析成倒置文档树 ,适用于解析少量xml文件 ,在大文件解析式需要消耗大量内存
【优点】
①允许应用程序对数据和结构做出更改。
②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。
【缺点】
①通常需要加载整个XML文档来构造层次结构,消耗资源大。
【解析详解】
①构建Document对象:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = bdf.newDocumentBuilder();
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(xml文件);
Document doc = bd.parse(is);
②遍历DOM对象
Document: XML文档对象,由解析器获取
NodeList: 节点数组
Node: 节点(包括element、#text)
Element: 元素,可用于获取属性参数

2.SAX解析 (Simple Api For XML)

sax(simle . . )采用流媒体加载方式即读取一部分解析一部分,解析完会释放内存 ,因此消耗内存少,但不能像Dom
流模型中的"推"模型分析方式。通过事件驱动,每发现一个节点就引发一个事件,事件推给事件处理器,通过回调方法
完成解析工作,解析XML文档的逻辑需要应用程序完成
【优势】
①不需要等待所有数据都被处理,分析就能立即开始。
②只在读取数据时检查数据,不需要保存在内存中。
③可以在某个条件得到满足时停止解析,不必解析整个文档。
④效率和性能较高,能解析大于系统内存的文档。
【缺点】
①需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),文档越复杂程序就越复杂。
②单向导航,无法定位文档层次,很难同时访问同一文档的不同部分数据,不支持XPath。
【原理】
简单的说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束时通知事件
处理函数(回调函数),进行相应处理,直到文档结束
【事件处理器类型】
①访问XML DTD:DTDHandler
②低级访问解析错误:ErrorHandler
③访问文档内容:ContextHandler
【DefaultHandler类】
SAX事件处理程序的默认基类,实现了DTDHandler、ErrorHandler、ContextHandler和EntityResolver接口,通常
做法是,继承该基类,重写需要的方法,如startDocument()
【创建SAX解析器】
SAXParserFactory saxf = SAXParserFactory.newInstance();
SAXParser sax = saxf.newSAXParser();
注:关于遍历
①深度优先遍历(Depthi-First Traserval)
②广度优先遍历(Width-First Traserval)

3.JDOM 解析 内部基于sax api ,通过 java 实现xml解析,使用一些具体类实现解析

Java特定的文档对象模型。自身不包含解析器,使用SAX
【优点】
①使用具体类而不是接口,简化了DOM的API。
②大量使用了Java集合类,方便了Java开发人员。
【缺点】
①没有较好的灵活性。
②性能较差。
【解析详解】
①指定解析器:
SAXBuilder builder =new SAXBuilder(false);//使用默认解析器
②得到Document对象
Document doc = builder.build(xmlpath);
③得到根节点:
Element rootElement = doc.getRootElement();
④得到节点元素集合
List list = rootElement.getChildren(tag);

4.DOM4J(document object for java) 基于JDOM优化分支 建议使用

 在jdom基础上大量使用java 的集合api实现解析,并且还具有快速节点检索解析

简单易用,采用Java集合框架,并完全支持DOM、SAX和JAXP
【优点】
①大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。
②支持XPath。
③有很好的性能。
【缺点】
①大量使用了接口,API较为复杂。
【解析详解】
①指定解析器:
SAXReader reader = new SAXReader();
②得到Document对象:
Document doc = reader.read(xmlpath);

DOM4J例子

将config.xml写入数据库test

config.xm文件

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


<configuration>
	<environments>
		<environment id="dev">
			<dataSource>
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
				<property name="username" value="root"/>
				<property name="password" value="123456"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/dao/Emp.xml"/>
		<mapper resource="com/dao/Dept.xml"/>
	</mappers>
</configuration> 

config.xml连接的dept.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ by softeem
  ~ copyrigrth(c) 2019
  -->

<Mapper>
	<table property="dept" name="dept">
		<property name="deptno" column="dno" type="int"/>
		<property name="deptname" column="dname" type="varchar" length="30"/>
		<property name="depttel" column="dtel" type="int" />

	</table>	
</Mapper>

config.xml连接的emp.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ by softeem
  ~ copyrigrth(c) 2019
  -->

<Mapper>
	<table property="emp" name="emp">
		<property name="empno" column="eno" type="int"/>
		<property name="empname" column="ename" type="varchar" length="30"/>
		<property name="empsex" column="sex" type="varchar" length="4"/>
		<property name="empage" column="age" type="int"/>
		<property name="birthday" column="birth" type="date"/>
	</table>	
</Mapper>

实体层entity

Colmum.class(用来显示创建表的列信息)

/*
 * by softeem
 * copyrigrth(c) 2019
 */

package com.dao.dto;


public class Colum {
    private String columName;
    private String columType;
    private int columlength;

    public String getColumName() {
        return columName;
    }

    public void setColumName(String columName) {
        this.columName = columName;
    }

    public String getColumType() {
        return columType;
    }

    public void setColumType(String columType) {
        this.columType = columType;
    }

    public int getColumlength() {
        return columlength;
    }

    public void setColumlength(int columlength) {
        this.columlength = columlength;
    }

    @Override
    public String toString() {
        return "Colum{" +
                "columName='" + columName + '\'' +
                ", columType='" + columType + '\'' +
                ", columlength=" + columlength +
                '}';
    }
}

config.class(对应config.xml)

/*
 * by softeem
 * copyrigrth(c) 2019
 */

package com.dao.dto;

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


public class Comfig {
    private String Driver;
    private String url;
    private String username;
    private String password;
    private List<Table> table =new ArrayList<>();

    public String getDriver() {
        return Driver;
    }

    public void setDriver(String driver) {
        Driver = driver;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<Table> getTable() {
        return table;
    }

    public void setTable(List<Table> table) {
        this.table = table;
    }

    @Override
    public String toString() {
        return "Comfig{" +
                "Driver='" + Driver + '\'' +
                ", url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", table=" + table +
                '}';
    }
}

Table表信息

/*
 * by softeem
 * copyrigrth(c) 2019
 */

package com.dao.dto;

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


public class Table {
    private String tablename;
    private List<Colum> colums =new ArrayList<>();

    public String getTablename() {
        return tablename;
    }

    public void setTablename(String tablename) {
        this.tablename = tablename;
    }

    public List<Colum> getColums() {
        return colums;
    }

    public void setColums(List<Colum> colums) {
        this.colums = colums;
    }

    @Override
    public String toString() {
        return "Table{" +
                "tablename='" + tablename + '\'' +
                ", colums=" + colums +
                '}';
    }
}
根据表配置文件得到 config对象
```java
/*
 * by softeem
 * copyrigrth(c) 2019
 */

package com.dao.xml;

import com.dao.dto.Colum;
import com.dao.dto.Comfig;
import com.dao.dto.Table;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.util.List;
import java.util.Objects;

/**
 * Author Administrator
 * Date 2019/9/23 0023 上午 9:21
 */
public class Comfigxml {

    private static String config ="config.xml";
    
    public Document parse(String xmlFile) throws DocumentException {

        //
        SAXReader reader =new SAXReader();
        InputStream is = this.getClass().getResourceAsStream("/"+xmlFile);

        Document doc = reader.read(is);
        return doc;
    }

    /***
     * 读取配置文件信息成为Decument对象
     * @return
     */
    public Comfig read() throws DocumentException {
        Document doc = parse(config);
        List<Node> list = doc.selectNodes("configuration/environments/environment/dataSource/property");
        Comfig comfig = new Comfig();

        list.forEach(node -> {
            //获取节点中属性的值

            String name = node.valueOf("@name");

            String value = node.valueOf("@value");
            if (Objects.equals(name,"driver")){
                comfig.setDriver(value);
            }else if(Objects.equals(name,"url")){
                comfig.setUrl(value);
            }else if(Objects.equals(name,"username")){
                comfig.setUsername(value);
            }else if(Objects.equals(name,"password")){
                comfig.setPassword(value);
            }
        });

        //搜索mappers节点
        List<Node> list1 = doc.selectNodes("configuration/mappers/mapper");
        list1.forEach(node ->{
            String mapperPath =node.valueOf("@resource");

            Table table =readAsTable(mapperPath);

            comfig.getTable().add(table);

        });


        return comfig;
    }


    private Table readAsTable(String mapperPath) {
        Table table = new Table();
        try {
            Document doc = parse(mapperPath);
            Node nodeTab = doc.selectSingleNode("Mapper/table");
            String tableName =nodeTab.valueOf("@name");
            table.setTablename(tableName);
            List<Node> list = nodeTab.selectNodes("property");
            list.forEach(node -> {
                Colum colum=new Colum();
                String cname = node.valueOf("@column");
                String ctype = node.valueOf("@type");
                String len = node.valueOf("@length");

                colum.setColumName(cname);
                colum.setColumType(ctype);
                if(Objects.nonNull(len) && !Objects.equals(len,"")){
                    colum.setColumlength(Integer.parseInt(len));

                }

                table.getColums().add(colum);
            });



        } catch (DocumentException e) {
            e.printStackTrace();
        }

        return table;
    }

    public static void main(String[] args) throws DocumentException {
        Comfigxml cf = new Comfigxml();
        Comfig read = cf.read();
        System.out.println(read);

    }


}

根据config对象信息,将表写入数据库

/*
 * by softeem
 * copyrigrth(c) 2019
 */

package com.dao.xml;

import com.dao.dto.Colum;
import com.dao.dto.Comfig;
import com.dao.dto.Table;
import org.dom4j.DocumentException;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

/**
 * Author Administrator
 * Date 2019/9/23 0023 上午 11:54
 */
public class TableGen {
    Comfig config=null;

    public TableGen(Comfig config) {
        this.config = config;
    }

    public void init() {

    }
    /**获取对象连接*/
    public Connection getConn(){
        return null;
    }

    //根据table获取sql
    public String getSql(Table table){
      String sql ="create table "+table.getTablename()+"(";
        List<Colum> colums=table.getColums();

        for (Colum c:colums) {
            sql +=c.getColumName()+" "+c.getColumType();
            if(c.getColumlength() != 0){
                sql +="("+c.getColumlength()+") ";
            }
            sql +=",";
        }
        sql =sql.substring(0,sql.length()-1) +")";
        return sql;
    }
    private void createTable(Connection conn,String sql){
        PreparedStatement  ps=null;
        try {
            ps =conn.prepareStatement(sql);

            boolean f= ps.execute();

            if(!f){
                System.out.println("建表完成:"+sql);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {

                try {
                    if(ps != null){
                    ps.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }

        }


    }

    public void execute(){
        String driverClass =config.getDriver();
        String url =config.getUrl();
        String username=config.getUsername();
        String password =config.getPassword();

        Connection conn=null;
        try {
           conn = DriverManager.getConnection(url,username,password);

            List<Table> tables =config.getTable();
            for(Table table :tables ){
                String sql =getSql(table);
                createTable(conn,sql);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {

            try {
                if(conn != null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }


    }
}
程序入口
```java
/*
 * by softeem
 * copyrigrth(c) 2019
 */

package com.test;

import com.dao.dto.Comfig;
import com.dao.xml.Comfigxml;
import com.dao.xml.TableGen;
import org.dom4j.DocumentException;

/**
 * Author Administrator
 * Date 2019/9/23 0023 下午 2:14
 */
public class Test {

    public static void main(String[] args) throws DocumentException {
        Comfigxml cf = new Comfigxml();
        Comfig config = cf.read();
        TableGen tg = new TableGen(config);
        tg.execute();
    }
}

在这里我们解析config.xml连接数据库创建表已经完了~~!
来看看成果吧 ^ v ^!

成果展示

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值