1、引入XStream工具,maven配置如下:
1
2 com.thoughtworks.xstream
3 xstream
4 1.4.10
5
View Code
2、要解析的xml格式如下:
1 <?xml version="1.0" encoding="UTF-8"?>
2
3
4 ccp
5
6
7
8 true
9 from11
10 to11
11 cc11
12 bcc11
13
14 testcode1-zh
15 testcode2-zh
16 testcode3-zh
17
18
19 testcode1-en
20 testcode2-en
21 testcode3-en
22
23
24
25
View Code
3、根据xml的结构定义对应的Java对象。定义的时候使用到相关的注解@XStreamAlias、@XStreamAsAttribute、@XStreamImplicit(具体解析参考https://blog.csdn.net/Robert_mm/article/details/8459879)
根节点类如下:
1 importcom.thoughtworks.xstream.annotations.XStreamAlias;2 importjava.util.ArrayList;3 importjava.util.List;4
5 @XStreamAlias("mail-config")6 public classMailConfig {7 privateMailHead head;8 private List mails=new ArrayList();9
10 publicMailHead getHead() {11 returnhead;12 }13
14 public voidsetHead(MailHead head) {15 this.head =head;16 }17
18 public ListgetMails() {19 returnmails;20 }21
22 public void setMails(Listmails) {23 this.mails =mails;24 }25 }
View Code
第二层定义如下:
head
1 importcom.thoughtworks.xstream.annotations.XStreamAlias;2
3 importjava.io.Serializable;4
5 @XStreamAlias("head")6 public class MailHead implementsSerializable {7 privateString systemType;8 privateString systemCode;9
10 publicString getSystemType() {11 returnsystemType;12 }13
14 public voidsetSystemType(String systemType) {15 this.systemType =systemType;16 }17
18 publicString getSystemCode() {19 returnsystemCode;20 }21
22 public voidsetSystemCode(String systemCode) {23 this.systemCode =systemCode;24 }25 }
View Code
mail类中注意注解@XStreamImplicit(itemFieldName="mailBody"),根据xml结构mailBody是没有根节点的,并排两个作为一个List,所以此处要使用这个注解才能正确解析成功。
1 importcom.thoughtworks.xstream.annotations.XStreamAlias;2 importcom.thoughtworks.xstream.annotations.XStreamImplicit;3
4 importjava.io.Serializable;5 importjava.util.List;6
7 @XStreamAlias("mail")8 public class Mail implementsSerializable {9 private boolean isOneTest=false;10 privateString mialfrom;11 privateString mailto;12 privateString mailcc;13 privateString mailbcc;14
15 @XStreamImplicit(itemFieldName="mailBody")16 private ListmailBodys;17
18 public booleanisOneTest() {19 returnisOneTest;20 }21
22 public void setOneTest(booleanoneTest) {23 isOneTest =oneTest;24 }25
26 publicString getMialfrom() {27 returnmialfrom;28 }29
30 public voidsetMialfrom(String mialfrom) {31 this.mialfrom =mialfrom;32 }33
34 publicString getMailto() {35 returnmailto;36 }37
38 public voidsetMailto(String mailto) {39 this.mailto =mailto;40 }41
42 publicString getMailcc() {43 returnmailcc;44 }45
46 public voidsetMailcc(String mailcc) {47 this.mailcc =mailcc;48 }49
50 publicString getMailbcc() {51 returnmailbcc;52 }53
54 public voidsetMailbcc(String mailbcc) {55 this.mailbcc =mailbcc;56 }57
58 public ListgetMailBodys() {59 returnmailBodys;60 }61
62 public void setMailBodys(ListmailBodys) {63 this.mailBodys =mailBodys;64 }65 }
View Code
importcom.thoughtworks.xstream.annotations.XStreamAlias;importcom.thoughtworks.xstream.annotations.XStreamAsAttribute;importjava.io.Serializable;
@XStreamAlias("mailBody")public class MailBodyConfig implementsSerializable {
@XStreamAsAttributeprivateString id;//xml中的节点名为:TestCode1,解决名称不对应问题
@XStreamAlias("TestCode1")privateString testCode1;
@XStreamAlias("TestCode2")privateString testCode2;
@XStreamAlias("TestCode3")privateString testCode3;publicString getId() {returnid;
}public voidsetId(String id) {this.id =id;
}publicString getTestCode1() {returntestCode1;
}public voidsetTestCode1(String testCode1) {this.testCode1 =testCode1;
}publicString getTestCode2() {returntestCode2;
}public voidsetTestCode2(String testCode2) {this.testCode2 =testCode2;
}publicString getTestCode3() {returntestCode3;
}public voidsetTestCode3(String testCode3) {this.testCode3 =testCode3;
}
}
View Code
具体调用测试代码如下:
1 public voidTestXml()2 {3 String xml="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
4 "\n" +
5 "
\n" +6 " ccp\n" +
7 " \n" +
8 " \n" +
9 " \n" +
10 " true\n" +
11 " from11\n" +
12 " to11\n" +
13 " cc11\n" +
14 " bcc11\n" +
15 " \n" +
16 " testcode1zh\n" +
17 " testcode2zh\n" +
18 " testcode3zh\n" +
19 " \n" +
20 " \n" +
21 " testcode1-en\n" +
22 " testcode2-en\n" +
23 " testcode3-en\n" +
24 " \n" +
25 " \n" +
26 " \n" +
27 "";28 //设置了这个别名才能识别下面 xml 中的 类对象节点的别名,否则要用类全限名称
29 XStream xstream = newXStream();30 XStream.setupDefaultSecurity(xstream);31 xstream.autodetectAnnotations(true);32 xstream.alias("mail-config",MailConfig.class);33 xstream.allowTypes(new Class[]{MailConfig.class, Mail.class});34
35 System.out.print(xml);36 MailConfig mailconfig=(MailConfig)xstream.fromXML(xml);37
38 System.out.print("转换成功!");39 }
View Code