解析XML文档,并把数据存到数据库中

init.XML文档

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

<init package="com.oa.model">
    <!-- 组织机构管理 -->
    <entity class= "Company"
            name = "大学"
            description = "塞上明珠"
            call = "partyService.addParty">
            
            <entity class="Department" name="教务处">
                <entity class="Position" name="教务处处长">
                    <entity class="Person" name="张三" sex="男" tel="1111">
                    </entity>
                </entity>
                <entity class="Position" name="教务处副处长">
                    <entity class="Person" name="李四" sex="女" tel="1222">
                    </entity>
                </entity>
            </entity>
            
            <entity class="Department" name="图书馆">
                <entity class="Position" name="图书馆馆长">
                    <entity class="Person" name="王五" sex="女" tel="2222">
                    </entity>
                    <entity class="Person" name="赵六" sex="男" tel="2111">
                    </entity>
                </entity>
            </entity>
            <entity class="Company" name="大学南校区"></entity>
         </entity>

</init>

//解析方法

public void addInitData() {
        try {
            //解析init.xml文档
            Document doc = new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream(init.xml));
            //得到根元素
            Element root = doc.getRootElement();
            //得到包名
            String pkg = root.valueOf("@package");
            
            //得到根元素下的entity集合
            List<Element> entities = root.selectNodes("entity");
            
            for(Iterator<Element> iter = entities.iterator() ; iter.hasNext();){
                Element e = iter.next();
                addEntity(e,pkg,null,null);
            }
           
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void addEntity(Element e, String pkg, Object parent, String callString) {
        try {
            //处理当前Element
            // 1. 要创建一个什么样类型的对象
            //要创建类的全包名
            String className = pkg + "." + e.attributeValue("class");
            //根据类名创建实体对象
            Object entity = Class.forName(className).newInstance();
            //给实体对象当中的属性赋值
            Iterator iter = e.attributeIterator();
            while(iter.hasNext()){
                Attribute attr = (Attribute)iter.next();
                String propName = attr.getName();
                //判断除了class和call属性的其它属性赋值
                if(!"class".equals(propName) && !"call".equals(propName)){
                    String propValue = attr.getValue();
                    BeanUtils.copyProperty(entity, propName, propValue);
                }
            }
            //给entity父实体属性赋值
            BeanUtils.copyProperty(entity, "parent", parent);
            
            // 2. 存储对象(调用哪一个Service的哪一个方法?)
            String call = e.attributeValue("call");
            if(call != null){
                callString = call;
            }
            
            if(callString == null){
                throw new RuntimeException("无法创建实体对象,调用方法未知!");
            }
            
            // 3. 调用相应的方法存储实体
            String[] mesg = callString.split("\\.");
            String serviceName = mesg[0];
            String methodName = mesg[1];
            //得到Service对象
            Object serviceObject = factory.getBean(serviceName);
            //得到要调用的Servce对象上的方法的反射类
            for(Method m : serviceObject.getClass().getMethods()){
                if(methodName.equals(m.getName())){                    
                    //调用这个方法
                    m.invoke(serviceObject, entity);
                }
            }
            
            // 4. 考虑当前Element下有没有子元素
            List<Element> subEntities = e.elements("entity");
            for(Iterator<Element> itr = subEntities.iterator(); itr.hasNext();){
                Element subElement = itr.next();
                addEntity(subElement, pkg, entity, callString);
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值