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

结果:


Java -- XStreamAlias 处理节点中的属性和值详解编程语言

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”)

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/18536.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论