sax解析xml

SaxParseXmlHandler.java
 
package sax.xml.handler;
 
import java.util.ArrayList;
import java.util.List;
 
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
 
import sax.xml.model.BeanNode;
import sax.xml.model.PropertyNode;
import sax.xml.utils.NodeConstants;
import sax.xml.utils.ReflectUtil;
 
/**
 * 解析xml的处理器
 * 
 * @author yongyang
 */
public class SaxParseXmlHandler extends DefaultHandler {
 
    //存放遍历集合
    private List<PropertyNode> lstPropertyNode = new ArrayList<PropertyNode>();
    //存放当前读到的mappingProperty标签的值,并将属性值存放到MappingProperty对象对应的属性
    private PropertyNode propertyNode;
    //构建NodeBean对象
    private BeanNode beanNode;
    
    public List<PropertyNode> getLstPropertyNode() {
        return lstPropertyNode;
    }
 
    public void setLstPropertyNode(List<PropertyNode> lstPropertyNode) {
        this.lstPropertyNode = lstPropertyNode;
    }
 
    public PropertyNode getPropertyNode() {
        return propertyNode;
    }
 
    public void setPropertyNode(PropertyNode propertyNode) {
        this.propertyNode = propertyNode;
    }
 
    public BeanNode getBeanNode() {
        return beanNode;
    }
 
    public void setBeanNode(BeanNode beanNode) {
        this.beanNode = beanNode;
    }
 
    /**
     * 处理标签里的内容:读取到标签里的内容时触发该函数
     * @param ch
     * @param start
     * @param length
     * @throws SAXException
     */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
    }
 
    /**
     * 文档结束时触发该函数
     * @throws SAXException
     */
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
 
    /**
     * 标签元素结束时触发该函数
     * @param uri
     * @param localName
     * @param qName
     * @throws SAXException
     */
    @Override
    public void endElement(String uri, String localName, String qName)
    throws SAXException {
        if(NodeConstants.PROPERTY_NODE.equals(qName)) {
            lstPropertyNode.add(propertyNode);
        } else if(NodeConstants.BEAN_NODE.equals(qName)) {
            beanNode.setPropertyNodes(lstPropertyNode);
        }
    }
 
    /**
     * 开始读取文档内容时触发该函数
     * @throws SAXException
     */
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
    }
 
    /**
     * 开始读取标签元素时触发该函数
     * @param uri
     * @param localName
     * @param qName
     * @param attributes
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName,
    Attributes attributes) throws SAXException {
        if(NodeConstants.BEAN_NODE.equals(qName)) {
            this.buildNodeBean(uri, localName, qName, attributes);
        } else if(NodeConstants.PROPERTY_NODE.equals(qName)) {
            this.buildPropertyNode(uri, localName, qName, attributes);
        }
    }
 
    /**
     * 构建BeanNode对象,并为其属性赋值
     * @param uri
     * @param localName
     * @param qName
     * @param attributes
     */
    private void buildNodeBean(String uri, String localName, String qName, Attributes attributes) {
        beanNode = new BeanNode();
        int iAttrLen = attributes.getLength();
        for(int i = 0; i < iAttrLen; i++) {
            String qAttrName = attributes.getQName(i);
            String qAttrVal = attributes.getValue(i);
            ReflectUtil.invokeSetMethod(beanNode, qAttrName, qAttrVal);
        }
    }
 
    /**
     * 构建PropertyNode对象,并为其属性赋值
     * @param uri
     * @param localName
     * @param qName
     * @param attributes
     */
    private void buildPropertyNode(String uri,String localName,String qName,Attributes attributes) {
        propertyNode = new PropertyNode();
        int iAttrLen = attributes.getLength();
        for(int i = 0; i < iAttrLen; i++) {
            String qAttrName = attributes.getQName(i);
            String qAttrVal = attributes.getValue(i);
            ReflectUtil.invokeSetMethod(propertyNode, qAttrName, qAttrVal);
        }
    }
}
 
 
SaxParseXmlHandlerFactory.java
 
package sax.xml.handler;
 
import java.io.InputStream;
 
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
 
import sax.xml.utils.*;
 
/**
 * 解析xml处理器的工厂类
 * 
 * @author yongyang
 */
public class SaxParseXmlHandlerFactory {
 
    private static SaxParseXmlHandlerFactory saxParseXmlHandlerFactory;
     
    public static SaxParseXmlHandlerFactory newInstance() {
        if(saxParseXmlHandlerFactory == null) {
            saxParseXmlHandlerFactory = new SaxParseXmlHandlerFactory();
        }
        return saxParseXmlHandlerFactory;
    }
 
    public SaxParseXmlHandler newSaxParseXmlHandler(String fileName) {
        fileName = NodeConstants.XML_FILE_SCAN_FOLDER.replaceAll("\\.", "/") + "/" + fileName;
        InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
        return newSaxParseXmlHandler(stream);
    }
 
    public SaxParseXmlHandler newSaxParseXmlHandler(InputStream stream) {
        SaxParseXmlHandler parseXmlHandler = null;
        try {
            parseXmlHandler = new SaxParseXmlHandler();
            // 构建SAXParser
            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
            parser.parse(stream, parseXmlHandler);
        } catch(Exception e) {
            //打印日志
        }
        return parseXmlHandler;
    }
}
 
BeanNode.java
 
package sax.xml.model;
 
import java.util.List;
 
public class BeanNode {
 
    private String className;
    private String tableName;
    private List<PropertyNode> propertyNodes;
     
    public String getClassName() {
        return className;
    }
     
    public void setClassName(String className) {
        this.className = className;
    }
     
    public String getTableName() {
        return tableName;
    }
     
    public void setTableName(String tableName) {
        this.tableName = tableName;
    }
     
    public List<PropertyNode> getPropertyNodes() {
        return propertyNodes;
    }
     
    public void setPropertyNodes(List<PropertyNode> propertyNodes) {
        this.propertyNodes = propertyNodes;
    }
}
 
 
PropertyNode.java
 
package sax.xml.model;
 
public class PropertyNode {
 
    private String name;
    private String tableField;
    private String type;
     
    public String getName() {
        return name;
    }
     
    public void setName(String name) {
        this.name = name;
    }
     
    public String getTableField() {
        return tableField;
    }
     
    public void setTableField(String tableField) {
        this.tableField = tableField;
    }
 
    public String getType() {
        return type;
    }
     
    public void setType(String type) {
        this.type = type;
    }
}
 
 
NodeConstants.java
 
package sax.xml.utils;
 
/**
 * 节点相关的常量接口
 * 
 * @author yangyong2
 */
public interface NodeConstants {
 
    public final static String BEAN_NODE = "bean";
     
    public final static String PROPERTY_NODE = "property";
     
    public final static String XML_FILE_SCAN_FOLDER = "sax.xml.model";
}
 
 
ReflectUtil.java
 
package sax.xml.utils;
 
@SuppressWarnings("unchecked")
public class ReflectUtil {
 
    public static void invokeSetMethod(Object obj, String propertyName, Object value) {
        try {
            if(obj == null || propertyName == null || value == null) {
            //TODO 打印日志
            }
            Class clazz = obj.getClass();
            String setMethodName = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
            clazz.getMethod(setMethodName, String.class).invoke(obj, value);
        } catch(Exception e) {
        //TODO 打印日志
        }
    }
 
    public static void batchInvokeSetMethod(Object obj, String[] propertyNames, Object[] values) {
        if(obj == null || propertyNames == null || values == null) {
            //TODO 打印日志
        }
        if(propertyNames.length != values.length) {
            //TODO 打印日志
        }
        for(int i = 0; i < propertyNames.length; i++) {
            invokeSetMethod(obj, propertyNames[i], values[i]);
        }
    }
}


你可能感兴趣的:(xml,sax)