• Java实现XML和JavaBean互转


    1、简介

    XStream是一个序列化JavaBean为XML文件以及反序列化的工具。

    2、准备

    2.1、XML回顾

    在学习这部分内容前,假设你对XML以及有一定的了解,至少能够分辨出XML的元素、属性、字段、包、系统属性、类型等等。例如有下边的一段XML:

    <bookstore>
        <book category="COOKING">
          <title lang="en">Everyday Italian</title> 
          <author>Giada De Laurentiis</author> 
          <year>2005</year> 
          <price>30.00</price> 
        </book>
        <book category="CHILDREN">
          <title lang="en">Harry Potter</title> 
          <author>J K. Rowling</author> 
          <year>2005</year> 
          <price>29.99</price> 
        </book>
        <book category="WEB">
          <title lang="en">Learning XML</title> 
          <author>Erik T. Ray</author> 
          <year>2003</year> 
          <price>39.95</price> 
        </book>
    </bookstore>

     它的元素、属性、元素等对应关系如下:

    看懂了上边的对应关系,就可以进行往下阅读了。

    2.2、能需要了解的概念 

    •  别名

     JavaBean的属性和XML里的表签名可能名称不一样,那么在相互转换过程中通过来设置别名来解决该问题。给Java类或某字段设置别名,在转换对应的XML里,该别名就是XML里的标签名称。可以设置别名的有:类、同一名字的全部属性,某一类中的某名字的属性、某类中的某字段、包、系统属性、类型。

    通过调用XStream的api来设置别名:

    void    alias(String name, Class type)
    void    alias(String name, Class type, Class defaultImplementation)
    void    aliasAttribute(Class definedIn, String attributeName, String alias)
    void    aliasAttribute(String alias, String attributeName)
    void    aliasField(String alias, Class definedIn, String fieldName)
    void    aliasPackage(String name, String pkgName)
    void    aliasSystemAttribute(String alias, String systemAttributeName)
    void    aliasType(String name, Class type)

    还可以通过注解来给类和字段配置别名:

    @XStreamAlias("student")
    public claa Student{
      @XStreamAlias("personName")   private String name; }

    用注解时,需要在xStream对象上设置使用注解来取别名:

    xStream.processAnnotations(Student.class); 
    • 选择哪些属性座位XML的标签属性
    void    useAttributeFor(Class type);//转换后该类对应的标签作为xml的属性
    void    useAttributeFor(Class definedIn, String fieldName);//该类下名为fieldName的字段在转换后,做为definedIn对应标签的属性
    void    useAttributeFor(String fieldName, Class type);//该类下名为fieldName的字段在转换后,做为definedIn对应标签的属性
    • 输入与输出

    JavaBean转到XML时,转出的XML字符可以直接返回给调用处,也可以用字符流或字节流输出:

    String    toXML(Object obj);//返回字符串
    void    toXML(Object obj, OutputStream out);//字节流
    void    toXML(Object obj, Writer out);//字符流

    XML转到JavaBean时,加载的XML文件可以是一段XML字符串、一个XML文件对象、XML文件字符输入流、XML文件字节输入流,甚至一个URL资源。可以指定传入一个JavaBean,将会用XML各个元素值来填充传入的JavaBean并返回,这里不会重新创建出一个JavaBean:

    Object    fromXML(File file);
    Object    fromXML(File file, Object root);
    Object    fromXML(InputStream input);
    Object    fromXML(InputStream input, Object root);
    Object    fromXML(Reader reader);
    Object    fromXML(Reader xml, Object root);
    Object    fromXML(String xml);
    Object    fromXML(String xml, Object root);
    Object    fromXML(URL url);
    Object    fromXML(URL url, Object root);

    3、实例演练

    objectAlias为将要设置的别名和字段对应集合。
    • JavaBean转为XML
      /**
         * JavaBean转为XML
         * @param objectT 将要转的JavaBean
         * @param objectAlias 别名集合
         * @return 返回的String字符串
         * @throws Exception
         */
        public static <T> String objectToContext(T objectT,
                Map<String, Class> objectAlias) throws Exception {
            XStream xStream = null;
            String context = null;
            
            try {
                xStream = new XStream(new Dom4JDriver());
                
                for(Map.Entry<String, Class> entry : objectAlias.entrySet()){
                    xStream.alias(entry.getKey(), entry.getValue());
                }
                context = xStream.toXML(objectT);
            } catch (Exception e) {
                LOGGER.error(e.getMessage());
                throw e;
            }
            return context;
        }
    • XML转为JavaBean
        /**
         * 把XML字符串转为对象,并返回
         * @param xmlContent XML字符串
         * @param objectAlias 别名集合
         * @param clazz 将要转换成的对象类型
         * @throws Exception 
         */
        public static  <T> T  contextToObject(String xmlContent,Map<String, Class> objectAlias, Class<T> clazz) throws Exception {
            XStream xStream = null;
            T objectT = null;
            
            try {
                xStream = new XStream(new Dom4JDriver());
                
                for(Map.Entry<String, Class> entry : objectAlias.entrySet()){
                    xStream.alias(entry.getKey(), entry.getValue());
                }
                
                objectT = (T) xStream.fromXML(xmlContent);
            } catch (Exception e) {
                LOGGER.error(e.getMessage());
                throw e;
            }
            
            return objectT;
        }
  • 相关阅读:
    出现身份验证错误 要求的函数不受支持,又找不到加密Oracle修正(亲测有效)
    .NET 同步钉钉接口的排班,和审批,并用审批回改排班,上班还是休息,请假或加班上午下午
    C# .NET 遍历Json 形成键值对 取节点值key value
    .net日期类与UNIX时间戳的相互转换,长数字
    PB里取datawindow类型的窗口名称
    js,JQ设置div或标签控件鼠标不可点击
    sql在所有存储过程中查询包含某字符串的执行语句
    QTableView之一:基本使用
    LeetCode 1317. 将整数转换为两个无零整数的和
    C++如何限制类对象只能静态分配或者只能只能动态分配
  • 原文地址:https://www.cnblogs.com/leocook/p/xml_xstream.html
Copyright © 2020-2023  润新知