xstream使用

 

一、新建实体bean,将xml文件转换为ThdReport与image列表

 

 
  1. package com.etoak.bean;

  2.  
  3. import java.util.List;

  4.  
  5. public class ThdReport {

  6. private Long id;

  7. private Short type;

  8. private String sn;

  9. private String title;

  10. private String name;

  11. private String gender;

  12. private String examDate;

  13. private String birthday;

  14. private Long patientId;

  15. private String conclusion; //Summary检查结果

  16. private String conclusionDesc;//Description检查描述

  17. private String operatorPhysician;

  18. private String performingPhysician;

  19. private String referringPhysician;

  20. private String age;

  21. private List<Image> images;

  22.  
  23. public List<Image> getImages() {

  24. return images;

  25. }

  26. public void setImages(List<Image> images) {

  27. images = images;

  28. }

  29. public Long getId() {

  30. return id;

  31. }

  32. public void setId(Long id) {

  33. this.id = id;

  34. }

  35. public Short getType() {

  36. return type;

  37. }

  38. public void setType(Short type) {

  39. this.type = type;

  40. }

  41. public String getSn() {

  42. return sn;

  43. }

  44. public void setSn(String sn) {

  45. this.sn = sn;

  46. }

  47. public String getTitle() {

  48. return title;

  49. }

  50. public void setTitle(String title) {

  51. this.title = title;

  52. }

  53. public String getName() {

  54. return name;

  55. }

  56. public void setName(String name) {

  57. this.name = name;

  58. }

  59. public String getGender() {

  60. return gender;

  61. }

  62. public void setGender(String gender) {

  63. this.gender = gender;

  64. }

  65. public String getExamDate() {

  66. return examDate;

  67. }

  68. public void setExamDate(String examDate) {

  69. this.examDate = examDate;

  70. }

  71. public String getBirthday() {

  72. return birthday;

  73. }

  74. public void setBirthday(String birthday) {

  75. this.birthday = birthday;

  76. }

  77. public Long getPatientId() {

  78. return patientId;

  79. }

  80. public void setPatientId(Long patientId) {

  81. this.patientId = patientId;

  82. }

  83. public String getConclusion() {

  84. return conclusion;

  85. }

  86. public void setConclusion(String conclusion) {

  87. this.conclusion = conclusion;

  88. }

  89. public String getConclusionDesc() {

  90. return conclusionDesc;

  91. }

  92. public void setConclusionDesc(String conclusionDesc) {

  93. this.conclusionDesc = conclusionDesc;

  94. }

  95. public String getOperatorPhysician() {

  96. return operatorPhysician;

  97. }

  98. public void setOperatorPhysician(String operatorPhysician) {

  99. this.operatorPhysician = operatorPhysician;

  100. }

  101. public String getPerformingPhysician() {

  102. return performingPhysician;

  103. }

  104. public void setPerformingPhysician(String performingPhysician) {

  105. this.performingPhysician = performingPhysician;

  106. }

  107. public String getReferringPhysician() {

  108. return referringPhysician;

  109. }

  110. public void setReferringPhysician(String referringPhysician) {

  111. this.referringPhysician = referringPhysician;

  112. }

  113. public String getAge() {

  114. return age;

  115. }

  116. public void setAge(String age) {

  117. this.age = age;

  118. }

  119. @Override

  120. public String toString() {

  121. return "ThdReport [id=" + id + ", type=" + type + ", sn=" + sn

  122. + ", title=" + title + ", name=" + name + ", gender=" + gender

  123. + ", examDate=" + examDate + ", birthday=" + birthday

  124. + ", patientId=" + patientId + ", conclusion=" + conclusion

  125. + ", conclusionDesc=" + conclusionDesc + ", operatorPhysician="

  126. + operatorPhysician + ", performingPhysician="

  127. + performingPhysician + ", referringPhysician="

  128. + referringPhysician + ", age=" + age + ", Images=" + images

  129. + "]";

  130. }

  131.  
  132. }

 

 
  1. package com.etoak.bean;

  2.  
  3. public class Image {

  4. private String path;

  5. private String type;

  6. private String content;

  7. public String getPath() {

  8. return path;

  9. }

  10. public void setPath(String path) {

  11. this.path = path;

  12. }

  13. public String getType() {

  14. return type;

  15. }

  16. public void setType(String type) {

  17. this.type = type;

  18. }

  19. public String getContent() {

  20. return content;

  21. }

  22. public void setContent(String content) {

  23. this.content = content;

  24. }

  25. @Override

  26. public String toString() {

  27. return "Image [path=" + path + ", type=" + type + ", content="

  28. + content + "]";

  29. }

  30.  
  31.  
  32. }

二、编写Image转换器,因为xml中的Image中既有属性又有内容

 
  1. package com.etoak.test;

  2.  
  3. import com.etoak.bean.Image;

  4. import com.thoughtworks.xstream.converters.Converter;

  5. import com.thoughtworks.xstream.converters.MarshallingContext;

  6. import com.thoughtworks.xstream.converters.UnmarshallingContext;

  7. import com.thoughtworks.xstream.io.HierarchicalStreamReader;

  8. import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

  9.  
  10. public class XStreamExpandConverter implements Converter{

  11.  
  12. @Override

  13. public boolean canConvert(Class type) {

  14. return type.equals(Image.class);

  15. }

  16. @Override

  17. public Object unmarshal(HierarchicalStreamReader reader,

  18. UnmarshallingContext context) {

  19. Image s = new Image();

  20. s.setPath(reader.getAttribute("Path"));

  21. s.setType(reader.getAttribute("Type"));

  22. s.setContent(reader.getValue());

  23. return s;

  24. }

  25. @Override

  26. public void marshal(Object source, HierarchicalStreamWriter writer,

  27. MarshallingContext context) {

  28. Image status = (Image) source;

  29. writer.addAttribute("Path", status.getPath());

  30. writer.addAttribute("Type", status.getType());

  31. writer.setValue(status.getContent());

  32. }

  33.  
  34. }

三、编写日期转换器,因为日期在xstream中不能直接转换为yyyy-MM-dd hh:mm:ss格式

 
  1. package com.etoak.test;

  2.  
  3. import java.text.DateFormat;

  4. import java.text.ParseException;

  5. import java.text.SimpleDateFormat;

  6. import java.util.Date;

  7.  
  8. import com.thoughtworks.xstream.converters.ConversionException;

  9. import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;

  10.  
  11. public class XStreamYMDDateConverter extends AbstractSingleValueConverter {

  12.  
  13. private static final DateFormat DEFAULT_DATEFORMAT = new SimpleDateFormat(

  14. "yyyy-MM-dd hh:mm:ss");

  15.  
  16. @Override

  17. public boolean canConvert(Class type) {

  18. return type.equals(Date.class);

  19. }

  20.  
  21. @Override

  22. public Object fromString(String str) {

  23. // 这里将字符串转换成日期

  24. try {

  25. return DEFAULT_DATEFORMAT.parseObject(str);

  26. } catch (ParseException e) {

  27. e.printStackTrace();

  28. }

  29. throw new ConversionException("Cannot parse datedd " + str);

  30. }

  31.  
  32. @Override

  33. public String toString(Object obj) {

  34. // 这里将日期转换成字符串

  35. return DEFAULT_DATEFORMAT.format((Date) obj);

  36. }

  37.  
  38. }

四、编写测试类

 

 
  1. package com.etoak.test;

  2.  
  3. import java.io.IOException;

  4. import java.io.ObjectInputStream;

  5. import java.io.ObjectOutputStream;

  6. import java.util.List;

  7.  
  8. import org.springframework.context.ApplicationContext;

  9. import org.springframework.context.support.ClassPathXmlApplicationContext;

  10.  
  11. import com.etoak.bean.Image;

  12. import com.etoak.bean.ThdReport;

  13. import com.thoughtworks.xstream.XStream;

  14.  
  15. public class Test {

  16. private XStream xstream = null;

  17. private ThdReport report = null;

  18. @org.junit.Test

  19. public void readXML4InputStream() {

  20.  
  21. try {

  22. xstream = new XStream();

  23. String s = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"

  24. +"<ReportInfo>"

  25. +"<Title></Title>"

  26. +"<PatientId>320525198109110058</PatientId>"

  27. +"<Name>吴志平</Name>"

  28. +"<Gender>true</Gender>"

  29. +"<Age>0</Age>"

  30. +"<ExamDate>16-01-08 18:25:48</ExamDate>"

  31. +"<Birthday>81-09-11 00:00:00</Birthday>"

  32. +"<Description>动脉血管内膜回声增强,增厚,有中断现象。于血管前、后壁可见斑快回声(1,为软斑呈弱回声或等回声2,为硬斑回声增强,后方有声影),团块回声附着于血管壁上。"

  33. +"彩色血流于动脉处出现充盈缺损,血流变细,色彩明显。于狭窄的近端有明亮及增宽的高速血流。提示有侧支循环建立。  "

  34. +"频谱多普勒于狭窄处取样收缩期峰值加快达 cm/s,舒张期反向血流消失频谱增宽,病变远端动脉,峰值速度、平均速度均减慢,呈低幅、单相血流。"

  35. +"频谱:有峰值后移现象</Description>"

  36. +"<Summary>动脉管壁正常结构消失,呈不规则向心性增厚,最厚达mm,回声不均匀,管腔狭窄,最窄处为 mm。"

  37. +"彩色血流于动脉处变细,出现五彩镶嵌或混叠现象(或彩色血流中断)。"

  38. +"频谱多普勒于病变处动脉取样,血流速度明显加快,频带增宽,频窗减小(或消失),狭窄远端血流频谱为低阻力、低速,单相血流,"

  39. +"动脉呈梭状(或囊状)扩张,内壁回声增强,不光滑。动脉瘤长:mm,宽:mm,开口mm。彩色血流于瘤体内呈红、蓝各半血流(旋流),此血流与动脉干内血流相连</Summary>"

  40. +"<OperatorPhysician></OperatorPhysician>"

  41. +"<PerformingPhysician>VINNOTester</PerformingPhysician>"

  42. +"<ReferringPhysician>VINNOTester</ReferringPhysician>"

  43. +"<Images>"

  44. +"<Image Path=\"E9352D9A4212449F91E54A3980220691\" Type=\"1\">iVBORw0KGgoAAAANSUhEUgOVbWd//f2f671nr6</Image>"

  45. +"<Image Path=\"87EFA807B0C84090B7001D72EB60F0F3\" Type=\"1\">iVBORw0KGgoAAAANSUhEUgAABOEAAALqCAYAAABzMk</Image>"

  46. +"<Image Path=\"D975EFD027CF4672A8CA6B895A10159A\" Type=\"1\">iVBORw0KCCEML/BxnYyYrfKXeUAAAAAElFTkSuQmCC</Image>"

  47. +"<Image Path=\"1ED902F498094A6496128594BE31B254\" Type=\"3\">iVBORw0KGgoAAAANSUhEUgAAgT0r9P/ug49yMtk8jAAAAAElFTkSuQmCC</Image>"

  48. +"</Images>"

  49. +"</ReportInfo>";

  50. failRed("---------ObjectInputStream## XML --> javaObject---------");

  51.   xstream.alias("ReportInfo",ThdReport.class);

  52. xstream.aliasField("Title", ThdReport.class, "title");

  53. xstream.aliasField("Name", ThdReport.class, "name");

  54. xstream.aliasField("Gender", ThdReport.class, "gender");

  55. xstream.aliasField("ExamDate", ThdReport.class, "examDate");

  56. xstream.aliasField("Birthday", ThdReport.class, "birthday");

  57. xstream.aliasField("PatientId", ThdReport.class, "patientId");

  58. xstream.aliasField("Summary", ThdReport.class, "conclusion");

  59. xstream.aliasField("Description", ThdReport.class, "conclusionDesc");

  60. xstream.aliasField("OperatorPhysician", ThdReport.class, "operatorPhysician");

  61. xstream.aliasField("PerformingPhysician", ThdReport.class, "performingPhysician");

  62. xstream.aliasField("ReferringPhysician", ThdReport.class, "referringPhysician");

  63. xstream.aliasField("Age", ThdReport.class, "age");

  64. xstream.aliasField("Images", ThdReport.class, "images");

  65. xstream.alias("Images", List.class);

  66. xstream.alias("Image", Image.class);

  67. xstream.registerConverter(new XStreamYMDDateConverter());

  68. xstream.registerConverter(new XStreamExpandConverter());

  69. ThdReport report = (ThdReport) xstream.fromXML(s);

  70. System.out.println(report);

  71. } catch (Exception e) {

  72. e.printStackTrace();

  73. }

  74. }

  75.  
  76. public final void fail(String string) {

  77. System.out.println(string);

  78. }

  79. public final void failRed(String string) {

  80. System.err.println(string);

  81. }

  82. }

五、简单介绍

 

 
  1. alias(String 别名,Class class)方法给转换类起个别名,当xml中要转换为类的标签和类名不一致(包+类名都一致才为一致)时使用

  2. aliasField(String 别名, Class class, String 属性名)

 
  1. registerConverter(new 转换器)

  2.  

 

 
 

六、下面是别人的xStream介绍可以参考下

http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197.html

http://www.blogjava.net/DLevin/archive/2012/11/30/392240.html

xstream将xml转换为JavaBean

 

XStream解析和读取xml报文

XStream处理既有属性又有值的xml节点

xstream转换Map和List

https://blog.csdn.net/just_you_java/article/details/50971208

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值