zoukankan      html  css  js  c++  java
  • Java -- XStreamAlias 处理节点中的属性和值

    XStreamAlias 可以把objec和xml相互转换,但是有时候节点带有属性和值就需要特殊处理下:


    <?xml version="1.0" encoding="UTF-8"?>
    <student>
        <studentList>
            <student_Message sid="1">
                <id>1</id>
                <idType name="身份证">1</idType>
                <idNo>1</idNo>
                <name>张三</name>            
                <gender name="男">1</gender>                            
            </student_Message>
            <student_Message id="2">
                <id>2</id>
                <idType name="护照">2</idType>
                <idNo>2</idNo>
                <name>李华</name>            
                <gender name="女">2</gender>                            
            </student_Message>
        </studentList>
    </student>    

    有时候需要生成或是解析上面这种XML。就需要用到XStream的其他属性

    pom:需要使用到  xstream-1.4.8.jar  

    <dependency>
      <groupId>com.thoughtworks.xstream</groupId>
       <artifactId>xstream</artifactId>
       <version>1.4.8</version>
    </dependency>

    创建实体类


    import com.thoughtworks.xstream.annotations.XStreamAlias;
    import java.util.List;
    /**
     * @author ceshi
     * @Title: StudentList
     * @ProjectName StudentList
     * @Description: TODO
     * @date 2018/7/1122:00
     */
    //定义最外节点属性
    @XStreamAlias("student")
    public class StudentList {
        //根据XML生成student集合
        private List<Student> studentList;
        public List<Student> getStudentList() {
            return studentList;
        }
    
        public void setStudentList(List<Student> studentList) {
            this.studentList = studentList;
        }
    }
    import com.thoughtworks.xstream.annotations.XStreamAlias;
    import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
    
    /**
     * @author ceshi
     * @Title: Student
     * @ProjectName ceshi
     * @Description: TODO
     * @date 2018/7/1121:54
     */
    //定义内部节点
    @XStreamAlias("student_Message")
    public class Student {
        //定义<student_Message sid="1">属性
        @XStreamAsAttribute()
        private String sid;
        private String id;
        private IdType idType;
        private String idNo;
        private String name;
        private Gender gender;
    
        public String getSid() {
            return sid;
        }
    
        public void setSid(String sid) {
            this.sid = sid;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public IdType getIdType() {
            return idType;
        }
    
        public void setIdType(IdType idType) {
            this.idType = idType;
        }
    
        public String getIdNo() {
            return idNo;
        }
    
        public void setIdNo(String idNo) {
            this.idNo = idNo;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Gender getGender() {
            return gender;
        }
    
        public void setGender(Gender gender) {
            this.gender = gender;
        }
    }
    import com.thoughtworks.xstream.annotations.XStreamAlias;
    import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
    import com.thoughtworks.xstream.annotations.XStreamConverter;
    import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;
    
    /**
     * @author ceshi
     * @Title: IdType
     * @ProjectName ceshi
     * @Description: TODO
     * @date 2018/7/1121:56
     */
    @XStreamAlias("MaxBenefitDurPeriod")
    @XStreamConverter(value = ToAttributedValueConverter.class, strings = { "value" })
    public class IdType {
        //// 将name作为Cat属性输出在父节点
        @XStreamAsAttribute()
        private String name;
        private String value;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    }
    import com.thoughtworks.xstream.annotations.XStreamAlias;
    import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
    import com.thoughtworks.xstream.annotations.XStreamConverter;
    import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;
    
    /**
     * @author ceshi
     * @Title: Gender
     * @ProjectName ceshi
     * @Description: TODO
     * @date 2018/7/1121:58
     */
    @XStreamAlias("MaxBenefitDurPeriod")
    @XStreamConverter(value = ToAttributedValueConverter.class, strings = { "value" })
    public class Gender {
        @XStreamAsAttribute()
        private String name;
        private String value;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    }

    工具类


    import com.thoughtworks.xstream.XStream;
    import com.thoughtworks.xstream.io.xml.DomDriver;
    
    /**
     * @author ceshi
     * @Title: XStreamUtils
     * @ProjectName ceshi
     * @Description: TODO
     * @date 2018/7/1122:10
     */
    public class XStreamUtils{
        /**
         * 将Object转换为xml
         * @param obj 转换的bean
         * @return bean转换为xml
         */
        public static String objectToXml(Object obj) {
            XStream xStream = new XStream();
            //xstream使用注解转换
            xStream.processAnnotations(obj.getClass());
            return xStream.toXML(obj);
        }
    
        /**
         * 将xml转换为T
         * @param <T> 泛型
         * @param xml 要转换为T的xml
         * @param cls T对应的Class
         * @return xml转换为T
         */
        public static <T> T xmlToObject(String xml, Class<T> cls){
            XStream xstream = new XStream(new DomDriver());
            //xstream使用注解转换
            xstream.processAnnotations(cls);
            return (T) xstream.fromXML(xml);
        }
    }

    测试类


    import org.junit.Test;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author ceshi
     * @Title: ceshi
     * @ProjectName ceshi
     * @Description: ceshiXStreamAlias
     * @date 2018/7/1121:53
     */
    public class JunitXStreamAlias {
        @Test
        public void test(){
            StudentList studentList = new StudentList();
            List<Student> list = new ArrayList<Student>();
            Student s = new Student();
            IdType i = new IdType();
            Gender g = new Gender();
            s.setSid("1");
            s.setId("1");
            i.setName("身份证");
            i.setValue("1");
            s.setIdType(i);
            s.setIdNo("1");
            s.setName("张三");
            g.setName("男");
            g.setValue("1");
            s.setGender(g);
            list.add(s);
            Student s1 = new Student();
            IdType i1 = new IdType();
            Gender g1 = new Gender();
            s1.setSid("2");
            s1.setId("2");
            i1.setName("护照");
            i1.setValue("2");
            s1.setIdType(i1);
            s1.setIdNo("2");
            s1.setName("李华");
            g1.setName("女");
            g1.setValue("2");
            s1.setGender(g1);
            list.add(s1);
            studentList.setStudentList(list);
            String xml = XStreamUtils.objectToXml(studentList);
            xml = "<?xml version="1.0" encoding="UTF-8"?>"+xml;
            xml = xml.replaceAll("__","_");
            System.out.println(xml);
         StudentList ss = XStreamUtils.xmlToObject(xml,StudentList.class);
         System.out.println(JSON.toJSON(ss));
      } }

    结果:


    XStream使用总结:


      XStreamAsAttribute 作用是将类内成员作为父节点属性输出,等同于xstream.useAttributeFor(Student.class, "sid")  
      XStreamAlias("cat") 等同于 xstream.alias("student_Message", Student.class);

      XStreamConverter xstreamConvert用于指定class及Field的converter(转换方式)。

      XStreamImplicit 注解使用当需要将collection或map类型的成员变量中数据转换成xml相同层次的元素时,可以在该成员变量使用该注解,会将添加注释的节点去掉 @XStreamImplicit(itemFieldName="studentList")

  • 相关阅读:
    Vue.Draggable/SortableJS 的排序功能,在VUE中的使用
    vue项目中安装使用echarts
    CSS3美化有序列表
    Git 设置
    javascript 使用btoa和atob来进行Base64转码和解码
    vue 裁剪图片,插件Cropper的使用
    PHPEXCEL xls模板导入,及格式自定义:合并单元格、加粗、居中等操作
    HTML5的 input:file上传 以及 类型控制
    phpexcel 导出到xls文件的时候出现乱码解决
    Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录
  • 原文地址:https://www.cnblogs.com/qinxu/p/9297099.html
Copyright © 2011-2022 走看看