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]);

}

}

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值