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

init.XML文档


    
                 name = "大学"
            description = "塞上明珠"
            call = "partyService.addParty">
            
            
                
                    
                    

                

                
                    
                   

                

            

            
            
                
                    
                    

                    
                    

                

            

            
        

//解析方法

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 entities = root.selectNodes("entity");
            
            for(Iterator 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 subEntities = e.elements("entity");
            for(Iterator itr = subEntities.iterator(); itr.hasNext();){
                Element subElement = itr.next();
                addEntity(subElement, pkg, entity, callString);
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }

你可能感兴趣的:(XML)