import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.security.AnyTypePermission;
import com.wyk.entity.User;
public class XmlTest {
public static void main(String[] args) {
User user = new User();
user.setName("张三");
user.setAge(18);
user.setAddress("北京市海淀区");
System.out.println("===================对象转换为XML===================");
XStream xstream = new XStream();
xstream.alias("User", User.class);
String xml = xstream.toXML(user);
System.out.println(xml);
System.out.println("===================XML转换为对象===================");
// 这表示告诉XStream处理MedicalCardTopUpLogHisRsp类中的注解。
xstream.processAnnotations(User.class);
// 这里添加了一个权限,允许XStream处理任何类型的数据。
xstream.addPermission(AnyTypePermission.ANY);
User userXml = (User) xstream.fromXML(xml);
System.out.println(userXml);
}
}
注意XML转换为对象,名字与类名或者属性名不一致,可以使用注解并在括号内注明别名。
例如在处理下面字符串时的情况(根标签为 Response,name 标签为 NAME)
String xmlString =
"<Response>\n" +
" <NAME>张三</NAME>\n" +
" <age>18</age>\n" +
" <address>北京市海淀区</address>\n" +
"</Response>";
// ======================
// 此时要将User类设置如下情况
@XStreamAlias("Response") // xml的根目录名
public class User {
@XStreamAlias("NAME") //xml的标签名
private String name;
private Integer age;
@XStreamOmitField // 设置此注解,xml转化为对象时会忽略该属性,结果为null
private String address;
@XStreamImplicit // 如果有 List 的情况下,在 List 属性上添加注解,子类中也可以添加上述注解
// @XStreamImplicit(itemFieldName="items")
private List<Child> items;
}
@XStreamImplicit
和@XStreamImplicit(itemFieldName="items")
的区别
当 xml 标签中有外部的标签<items></items>
包裹时,需要忽略 items 时使用第二个数据,不需要时使用第一个
例如下面这个 xml 的部分,我们只需要一个 items 作为集合名时就要用@XStreamImplicit(itemFieldName="items")
忽略多余的 items
<items>
<name>王二</name>
<age>15</age>
</items>
<items>
<name>李四</name>
<age>16</age>
</items>
<items>
<name>张三</name>
<age>17</age>
</items>