Java -- XStreamAlias 处理节点中的属性和值

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


 

<?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>

建立实体类this


 

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

工具类spa


 

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

 

测试类code


 

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

结果:xml


 

 

XStream使用总结:blog


 

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

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

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

相关文章
相关标签/搜索