XML文件配置转化对象使用

        我们在做移动开发的时候,会把一些变化的,或者固定的配置信息放到一个地方进行同意管理,存储。

        起初的开发者,一般会直接放到一个类中,以静态的方式存放。比如请求地址url,数据库配置信息的数据库名,表名,字段名等。到了后来,需要配置的信息慢慢变的越来越多,那么就统一到一个专门的配置文件中放到资源里面,设定好数据存放规则,以一定的方式来读取配置信。

        再到后来,又有升级的概念,如果需要动态的从服务器改变这些参数,只需要和服务器进行迭代升级,更新这个文件就可以进行动态的从服务器修改客户端的配置信息,那么这需要对文件进行版本的处理。这已经是很好的管理这些配置信息的方式了。

         说到这里,那么为什么我还要提出这个XML文件配置转化对象使用呢?因为在配置文件中,都是通过读取文件获取String,或者int,long,double,float,这些的数据在代码中使用,比如数据库名,表名,字段名字,等。这些都是一个一个的分散的的字符串,那么如果把一个数据库的这些固定配置当作一个对象呢,就非常容易调用了,只需要调用这个对象,那么关于数据库的所有的配置都在这个对象里面,如果想修改这个数据库,也会很方便的找到这个数据库配置对象。也会使新的参与开发者容易理解,看的懂这些数据。不再按照字符串一个一个找那些配置信息了。只需要找到数据的配置对象,就知道了所有的数据配置。大大提交可读性,还有可修改。和服务器进行对比升级文件也会很容易的多。

说了那么多的优点,接下来上例子:

       

        把配置文件放到sestes目录下,如果是对象则:

             如果是列表则:

        如果是字符串则:

        如果对象中引用某个 字符串则,对象中的属性是对象,且不是引入::

        如果是对象,引入对象,则是:

 


          代码:

package com.xiaoyunchengzhu.xmlconvertobject.Configuration;


import android.content.Context;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

/**
 * Created by zhangshiyu on 2016/4/13.
 */
public class ConfigResourcesSection {


    private InputStream inputStream;
    public ConfigResourcesSection(boolean isAssets)
    {
        if (isAssets)
        {
            inputStream=getUrlStringStream();
        }else {
            //undo 应该自定义在本地中的文件流
        }
    }

    /**
     * assets's resource
     * @return
     */
    private  InputStream getUrlStringStream()
    {
        String path="/assets/Configuration/configResource.xml";
        InputStream inStream = ConfigResourcesSection.class.getResourceAsStream(path);
        return inStream;
    }

    /**
     * you can user-defined resouce'path.in sdcard.
     * @param context
     * @return
     */
    private  InputStream getUrlStringStream(Context context)
    {
        String path=context.getFilesDir().getAbsolutePath()+"/configResource.xml";
        File file=new File(path);
        InputStream inputStream=null;
        try {
             inputStream=new FileInputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return inputStream;
    }


    /**
     *
     * listItem
     * @param urlNode
     * @return
     */
    public      Object getValueFromUrlNode(Node urlNode,ConfigConverter configConverter)
    {
        Object o=null;
        try {
            Node type1 = urlNode.getAttributes().getNamedItem("Type");
            if (type1== null ) {
                String className = urlNode.getAttributes().getNamedItem("Class").getNodeValue();

                Class<?> aClass = Class.forName(className);
                o = aClass.newInstance();

                for (int i = 0; i < urlNode.getAttributes().getLength(); i++) {
                    String nodeName = urlNode.getAttributes().item(i).getNodeName();
                    if (!nodeName.equals("Id") && !nodeName.equals("Class")&&!nodeName.equals("propertyName")) {
                        Field declaredField = aClass.getDeclaredField(nodeName);
                        declaredField.setAccessible(true);
                        String value = urlNode.getAttributes().item(i).getNodeValue();
                        if (!value.startsWith("@")) {
                            String type = declaredField.getType().toString();

                            if (type.endsWith("int")) {
                                declaredField.setInt(o, Integer.valueOf(value));
                            } else if (type.endsWith("double")) {
                                declaredField.setDouble(o, Double.valueOf(value));
                            } else if (type.endsWith("char")) {
                                declaredField.setChar(o, value.charAt(0));
                            } else if (type.endsWith("byte")) {
                                declaredField.setByte(o, Byte.valueOf(value));
                            } else if (type.endsWith("boolean")) {
                                declaredField.setBoolean(o, Boolean.valueOf(value));
                            } else if (type.endsWith("float")) {
                                declaredField.setFloat(o, Float.valueOf(value));
                            } else if (type.endsWith("long")) {
                                declaredField.setLong(o, Long.valueOf(value));
                            } else if (type.endsWith("short")) {
                                declaredField.setShort(o, Short.valueOf(value));
                            } else {
                                declaredField.set(o, value);
                            }
                        }else {

                            declaredField.set(o,configConverter.convert(getId(value),getType(value)));
                        }
                    }
                }
                NodeList childNodes = urlNode.getChildNodes();
                for (int i=0;i<childNodes.getLength();i++)
                {
                    if (childNodes.item(i).getNodeName().equals("add"))
                    {
                        Node propertyName = childNodes.item(i).getAttributes().getNamedItem("propertyName");
                        Node type = childNodes.item(i).getAttributes().getNamedItem("Type");
                        Field declaredField = aClass.getDeclaredField(propertyName.getNodeValue());
                        declaredField.setAccessible(true);
                        if (type!=null) {
                            declaredField.set(o, configConverter.convert(childNodes.item(i).getAttributes().getNamedItem("Id").getNodeValue(), type.getNodeValue()));
                        }else {
                            declaredField.set(o,getValueFromUrlNode(childNodes.item(i), configConverter));
                        }
                    }

                }

                }else {
                o= configConverter.convert(urlNode.getAttributes().getNamedItem("Id").getNodeValue(),urlNode.getAttributes().getNamedItem("Type").getNodeValue());
            }

        }catch(ClassNotFoundException e){
                e.printStackTrace();
            }catch(InstantiationException e){
                e.printStackTrace();
            }catch(IllegalAccessException e){
                e.printStackTrace();
            }catch(NoSuchFieldException e){
                e.printStackTrace();
            }

        return  o;
    }



    /**
     * root element
     * @return
     */
    public  Element getRootElement()
    {

        Document document=null;
        //DOM文件创建工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //DOM创建对象
        DocumentBuilder builder = null;
        try {
            builder = factory.newDocumentBuilder();

        //获取XML的DOM
         document = builder.parse(inputStream);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return document.getDocumentElement();
    }

    /**
     *
     * @param value example @String/id
     * @return   Type
     */
    private String getType(String value)
    {

        return value.substring(1,value.indexOf("/"));
    }

    /**
     *
     * @param value example @String/id
     * @return Id
     */
    private String getId(String value)
    {
        return value.substring(value.indexOf("/")+1,value.length());
    }

}

上代码,这是配置xml读取方式的处理类。

 

package com.xiaoyunchengzhu.xmlconvertobject.Configuration;

/**
 * Created by zhangshiyu on 2016/4/13.
 * converter abstract class.
 */
public abstract class ConfigConverter<T> {

    ConfigResourcesSection urlResourcesSection=new ConfigResourcesSection(true);
    abstract T convert(String id);
    public Object  convert(String id,String type){
        ConfigManger configManger=new ConfigManger();

        return configManger.convert(id,type);
    }
}
这是转化对象类型的抽象类。

package com.xiaoyunchengzhu.xmlconvertobject.Configuration;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Created by zhangshiyu on 2016/4/13.
 */
public class ObjectConverter extends ConfigConverter  {


    private String node;
    public ObjectConverter(String node)
    {
        this.node=node;
    }
    @Override
    public Object convert(String id) {

        Object o=null;
        Element rootElement = urlResourcesSection.getRootElement();
        Element element = (Element)rootElement.getElementsByTagName(node).item(0);
        NodeList add = element.getElementsByTagName("add");
        for (int i=0;i<add.getLength();i++)
        {
            Node id1 = add.item(i).getAttributes().getNamedItem("Id");
            if (id1!=null) {
                if (id1.getNodeValue().equals(id) && add.item(i).getAttributes().getNamedItem("Type") == null) {
                    o = urlResourcesSection.getValueFromUrlNode(add.item(i), this);
                }
            }
        }
        return o;
    }


}
这是对象转化类。

package com.xiaoyunchengzhu.xmlconvertobject.Configuration;


import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by zhangshiyu on 2016/4/13.
 */
public class ListConverter extends ConfigConverter  {


    private String node;
    public ListConverter(String node)
    {
        this.node=node;
    }
    @Override
    public Object convert( String id) {
        List<Object> l=null;
        Element rootElement = urlResourcesSection.getRootElement();
        Element itemList = (Element)rootElement.getElementsByTagName(node).item(0);
        NodeList li = itemList.getElementsByTagName("li");
        for (int i=0;i<li.getLength();i++)
        {
            Node id1 = li.item(i).getAttributes().getNamedItem("Id");
            if (id1!=null) {
                if (id1.getNodeValue().equals(id) && li.item(i).getAttributes().getNamedItem("Type") == null) {
                    Element item1 = (Element) li.item(i);
                    NodeList add = item1.getElementsByTagName("add");
                    NodeList string = item1.getElementsByTagName("string");
                    l = new ArrayList<>();
                    if (add.getLength() > 0) {

                        for (int j = 0; j < add.getLength(); j++) {
                            l.add(urlResourcesSection.getValueFromUrlNode(add.item(j), this));
                        }
                    } else if (string.getLength() > 0) {
                        for (int j = 0; j < string.getLength(); j++) {

                            l.add(string.item(j).getTextContent());
                        }
                    }

                }
            }
        }
        return l;
    }


}
这是列表转化类,这里用的是list列表;

package com.xiaoyunchengzhu.xmlconvertobject.Configuration;

import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
 * Created by zhangshiyu on 2016/4/14.
 */
public class StringConverter extends ConfigConverter{

    private String node;
    public StringConverter(String node)
    {
        this.node=node;
    }
    @Override
    Object convert(String id) {
        Object o=null;
        Element rootElement = urlResourcesSection.getRootElement();
        Element element = (Element)rootElement.getElementsByTagName(node).item(0);
        NodeList add = element.getElementsByTagName("string");
        for (int i=0;i<add.getLength();i++)
        {
            if (add.item(i).getAttributes().getNamedItem("Id").getNodeValue().equals(id))
            {
                   Element element1= (Element) add.item(i);
                o=element1.getTextContent();
            }
        }
        return o;
    }
}
这是字符串转化类;

package com.xiaoyunchengzhu.xmlconvertobject.Configuration;

/**
 * Created by zhangshiyu on 2016/4/13.
 * manage converter'object,xml to object.
 */
public class ConfigManger {

    private ConfigConverter configConverter;
    public  String listNode="List";
    public  String objectNode="Object";
    public  String stringNode="String";

    public Object convertList(String id)
    {
        configConverter=new ListConverter(listNode);
        return  configConverter.convert(id);
    }
    public Object convertObject(String id)
    {
        configConverter=new ObjectConverter(objectNode);
        return configConverter.convert(id);
    }
    public Object convertString(String id)
    {
        configConverter=new StringConverter(stringNode);
        return configConverter.convert(id);
    }
    protected Object convert(String id,String type)
    {
        Object o=null;
          if (type.equals(listNode))
          {
              o= convertList(id);
          }else if (type.equals(objectNode))
          {
              o= convertObject(id);
          }else if (type.equals(stringNode))
          {
              o=convertString(id);
          }
        return o;

    }

}
这是统一转化管理类;

这些对象的bean类就不列举了。

package com.xiaoyunchengzhu.xmlconvertobject;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import com.google.gson.Gson;
import com.xiaoyunchengzhu.XmlId;
import com.xiaoyunchengzhu.xmlconvertobject.Configuration.XmlResolve;
import com.xiaoyunchengzhu.xmlconvertobject.model.DataUrlBean;
import com.xiaoyunchengzhu.xmlconvertobject.model.Person;
import com.xiaoyunchengzhu.xmlconvertobject.model.Response;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@InjectView(R.id.show)
 TextView show;
Gson gson;
@XmlId("list1")
List<DataUrlBean> list1;
@XmlId("list2")
List<String> list2;
@XmlId("list3")
List<Response> list3;
@XmlId("dataUrlBean1")
DataUrlBean dataUrlBean1;
@XmlId("person1")
Person person1;
@XmlId("response1")
Response response1;
@XmlId("response2")
Response response2;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    XmlResolve.find(this);
    ButterKnife.inject(this);
    gson=new Gson();
}

@OnClick({R.id.showlist1,R.id.showlist2,R.id.showlist3,R.id.dataUrlBean1, R.id.person1,R.id.response1,R.id.response2,R.id.showboy1,R.id.int1,R.id.long1,R.id.float1,R.id.double1,R.id.char1,R.id.boolean1
,R.id.boolean2,R.id.map1})
public void onClick(View v) {
    String content="";
    switch (v.getId())
    {
        case R.id.showlist1:
            content=gson.toJson(list1);
            break;
        case R.id.showlist2:
            content=gson.toJson(list2);
            break;
        case R.id.showlist3:
            content=gson.toJson(list3);
            break;
        case R.id.dataUrlBean1:
            content=gson.toJson(dataUrlBean1);
            break;
        case R.id.person1:
            content=gson.toJson(person1);
            break;
        case R.id.response1:
            content=gson.toJson(response1);
            break;
        case R.id.response2:
            content=gson.toJson(response2);
            break;
        case R.id.showboy1:
            content+= XmlResolve.find("boy1");
            break;
        case R.id.int1:
            content+= XmlResolve.find("int1");
            break;
        case R.id.long1:
            content+= XmlResolve.find("long1");
            break;
        case R.id.float1:
            content+= XmlResolve.find("float1");
            break;
        case R.id.double1:
            content+= XmlResolve.find("double1");
            break;
        case R.id.char1:
            content+= XmlResolve.find("char1");
            break;
        case R.id.boolean1:
            content+= XmlResolve.find("boolean1");
            break;
        case R.id.boolean2:
            content+= XmlResolve.find("boolean2");
            break;
        case R.id.map1:
            content= XmlResolve.find("map1").toString();
            break;



    }
    show.setText(content);
}
}
    注解代码不附了,下面有源码地址。

        这是展示类。在activity里面展示转化对象的结果,由json的方式展示。

      更新:增加了注解方式来通过注解处理器绑定xml文件中的id 到 对象。对对象进行初始化,实例化。annotation processor 来预处理注解,Javapoet来生成类 在生成的类中对被注解的对象进行初始化。

       有问题请QQ:2550122536

        源码地址:https://github.com/xiaoyunchengzhu/XmlConvertObject


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值