1. 程式人生 > >解析XML文件,並把資料存到資料庫中

解析XML文件,並把資料存到資料庫中

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();
        }
    }