使用XStream注解处理xml的属性及数据集合

更新时间:2023-08-03 12:55:54 阅读: 评论:0

使⽤XStream注解处理xml的属性及数据集合相关jar包的Gradle设置
com.thoughtworks.xstream:xstream:1.4.8
xml的解析
⼀个看着⽐较“正常”的带有集合的xml
1. carInfos做为根元素,其⼦元素是由N个carInfo组成的集合,每个carInfo元素描述⼀个对象信息。
2. carInfo的⼦元素,每个tag做为属性名,tag所包含的txt做为属性值。
<carInfos dwName="w_vehicle_DW">
<carInfo index="1">
<VehicleId>FTBAUD0088</VehicleId>
<VehicleName>福克斯CAF7163B5轿车</VehicleName>
<Remark>两厢双离合舒适型国Ⅴ</Remark>
<VehiclePrice>101800</VehiclePrice>
</carInfo>
<carInfo index="2">
<VehicleId>FTBAUD0078</VehicleId>
<VehicleName>福克斯CAF7163B5轿车</VehicleName>
<Remark>两厢双离合风尚型国Ⅴ</Remark>
<VehiclePrice>113800</VehiclePrice>
</carInfo>
<carInfo index="3">
<VehicleId>FTBAUD0097</VehicleId>
<VehicleName>福克斯CAF7163B5轿车</VehicleName>
<Remark>两厢双离合智⾏版风尚型国Ⅴ</Remark>
<VehiclePrice>115800</VehiclePrice>
曾轶可狮子座</carInfo>
</carInfos>
与xml元素对应的Java类
对应carInfos元素
@XStreamAlias("carInfos")//对应carInfos元素
public class CarInfos {
@XStreamAsAttribute
private String dwName;//对应carInfos元素的dwName属性
@XStreamImplicit(itemFieldName = "carInfo")
private List<CarInfo> carInfoList = new ArrayList<CarInfo>();//对应N个carInfo元素组成的集合
//省略getter/tter⽅法
}
对应carInfo元素
@XStreamAlias("carInfo")//对应carInfo元素
public class CarInfo {
@XStreamAsAttribute
private String index;//对应carInfo的index属性
@XStreamAlias("VehicleId")
private String vehicleId;//对应carInfo的VehicleId⼦元素
@XStreamAlias("VehicleName")
private String VehicleName;//对应carInfo的VehicleName⼦元素
@XStreamAlias("Remark")
private String remark;//对应carInfo的Remark⼦元素
@XStreamAlias("VehiclePrice")
private String vehiclePrice;//对应carInfo的VehiclePrice⼦元素
//省略getter/tter⽅法
}
解析xml
public static void main(String[] args) throws Exception {
File dataXml = readXml();//读取xml
XStream xstream = new XStream(new DomDriver());//创建Xstram对象
xstream.autodetectAnnotations(true);
xstream.processAnnotations(CarInfos.class);
秦桧简介CarInfos carInfos = (CarInfos) xstream.fromXML(dataXml);
//打印对象
System.out.printf("CarInfos dwName:%s\n", DwName());
for (CarInfo carInfo : CarInfoList()) {
System.out.printf("\tCarInfo index:%s\n", Index());
望岳主旨System.out.printf("\tCarInfo VehicleId:%s\n", VehicleId());
System.out.printf("\tCarInfo VehicleName:%s\n", VehicleName());
System.out.printf("\tCarInfo VehiclePrice:%s\n", VehiclePrice());
System.out.printf("\tCarInfo Remark:%s\n", Remark());
}
//将对象转为xml,再次打印
String resultXml = XML(carInfos);
System.out.printf("=======================\n" + resultXml);
}
不太⼀样的xml
⼀个“有点别扭”的xml
特点是carInfo元素下是多个attribute元素的集合。但是很明显,每个attribute元素的属性name的值,都本应该是carInfo元素的⼦元素的tagName。
<carInfos dwName="w_vehicle_DW">
<carInfo index="1">
<attribute name="VehicleId">FTBAUD0088</attribute>
男胖脸发型
<attribute name="VehicleName">福克斯CAF7163B5轿车</attribute>
<attribute name="Remark">两厢双离合舒适型国Ⅴ</attribute>
<attribute name="VehiclePrice">101800</attribute>
</carInfo>
<carInfo index="2">
<attribute name="VehicleId">FTBAUD0078</attribute>
<attribute name="VehicleName">福克斯CAF7163B5轿车</attribute>
<attribute name="Remark">两厢双离合风尚型国Ⅴ</attribute>
<attribute name="VehiclePrice">113800</attribute>
</carInfo>
<carInfo index="3">
<attribute name="VehicleId">FTBAUD0097</attribute>
<attribute name="VehicleName">福克斯CAF7163B5轿车</attribute>
<attribute name="Remark">两厢双离合智⾏版风尚型国Ⅴ</attribute>
<attribute name="VehiclePrice">115800</attribute>
</carInfo>
</carInfos>
与xml元素对应的Java类
根据attribute元素,新建⼀个CarAttr类。
注意这⾥使⽤到@XStreamCoverter注解。
⽽且没有对成员变量添加注解。
@XStreamAlias("attribute")
@XStreamConverter(CarAttrConverter.class)
public class CarAttr {
//没有使⽤@XStreamAsAttribute注解
private String name;
//没有使⽤注解
日本国庆节
private String value;
//省略getter/tter⽅法
对CarInfo类进⾏修改,因为carInfo元素下是多个attribute元素,所以定义了⼀个List集合。如同CarInfos与CarInfo的关系。
@XStreamAlias("carInfo")
public class CarInfo {
@XStreamAsAttribute
private String index;
@XStreamImplicit(itemFieldName = "attribute")
private List<CarAttr> attrs = new ArrayList<CarAttr>();
//省略getter/tter⽅法
}
定义CarAttr转换类
import com.verters.Converter;
import com.verters.MarshallingContext;
恩格斯名言import com.verters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
public class CarAttrConverter implements Converter {
@Override
public boolean canConvert(Class type) {
return type.equals(CarAttr.class);//转换条件
全国最新一期
}
/**
* 将java对象转为xml时使⽤
*/
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
CarAttr attr = (CarAttr) source;
// writer.startNode("attribute");
writer.addAttribute("name", Name());
writer.Value());
// dNode();
}
/**
* 将xml转为java对象使⽤
*/
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
CarAttr a = new CarAttr();// 在解析attribute元素时,先创建⼀个CarAttr对象
a.Attribute("name"));// 将attribute元素的name属性设置为CarAttr对象的name属性值
a.Value());// 将attribute元素的txt值设置为CarAttr对象的value值
return a;
}
}
解析xml
public static void main(String[] args) throws Exception {
File dataXml = readXml();
XStream xstream = new XStream(new DomDriver());
xstream.autodetectAnnotations(true);
xstream.processAnnotations(CarInfos.class);
CarInfos carInfos = (CarInfos) xstream.fromXML(dataXml);
//打印对象
System.out.printf("CarInfos dwName:%s\n", DwName());专业的英语单词
for (CarInfo carInfo : CarInfoList()) {
System.out.printf("\tCarInfo index:%s\n", Index());
for (CarAttr ca : Attrs()) {
System.out.printf("\t\tCarAttr name:%s,value:%s\n", ca.getName(), ca.getValue());
}
}
String resultXml = XML(carInfos);
System.out.printf("=======================\n" + resultXml);
}
两个xml的解析⽅法没有区别,只是在打印解析出的对象时,稍有不同。
主要区别在于根据attribute元素,新增加了CarAttr类的定义,及与CarAttr类对应CarAttrConverter转换类的使⽤。

本文发布于:2023-08-03 12:55:54,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1127667.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:元素   对象   属性   集合   对应   离合   注解   没有
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图