thoughtworks简介
thoughtworks是解析XML的工具,此工具只需要根据XML的结构创建相应的Java Bean即可,不需要在代码中指定各元素的层次结构
使用
pom.xml中引入依赖包
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.11.1</version>
<type>jar</type>
</dependency>
Person.xml
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>lgc</name>
<address>
<province>河南省</province>
<city>洛阳市</city>
</address>
</person>
根据上面Person.xml的结构写Java Bean文件,因为XML中address还包含子元素,所以address也要作为一个Java Bean
Address.java
package cn.lgc.study.xml.parse.entity;
/**
* 住址
* @author 64630
*
*/
public class Address {
/** 省份 */
private String province;
/** 城市 */
private String city;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address [province=" + province + ", city=" + city + "]";
}
}
Person.java
package cn.lgc.study.xml.parse.entity;
public class Person {
private String name;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "Person [name=" + name + ", address=" + address + "]";
}
}
解析XML测试一下
public void parseSimple() {
String xmlFileNmae = "Person.xml";
InputStream ins = ClassLoader.getSystemResourceAsStream(xmlFileNmae);
XStream xstream = new XStream(new StaxDriver());
xstream.alias("person", Person.class); // 指定XML根节点的节点名和对应的java Bean
Class<?>[] classes = new Class[] { Address.class}; // 允许的类型集合
XStream.setupDefaultSecurity(xstream); //注释掉不影响解析
xstream.allowTypes(classes); // 允许的类型
Person person = (Person) xstream.fromXML(ins);
System.out.println(person);
}
输出结果
Person [name=lgc, address=Address [province=河南省, city=洛阳市]]
解析带重复节点的XML
假设有下面XML文件,root元素中包含多个重复节点
PersonGroup.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 包含了一组person元素 -->
<group>
<person>
<name>lgc</name>
<address>
<province>河南省</province>
<city>洛阳市</city>
</address>
</person>
<person>
<name>zds</name>
<address>
<province>上海</province>
<city>浦东新区</city>
</address>
</person>
</group>
因为是group元素包含了多个person元素,所以还需要新建一个Group.java文件
解析时只需要加上下面这句话就可以解析重复节点
xstream.addImplicitCollection(Group.class, “person”, Person.class);
- 第一个参数:包含重复节点的Java Bean类型
- 第二个参数:xml中重复的节点名
- 第三个参数:重复节点对应的Java Bean类型
Group.java
package cn.lgc.study.xml.parse.entity;
import java.util.List;
/**
* 包含了一组person的对象
* @author 64630
*
*/
public class Group {
private List<Person> person; //属性名一定要和xml中的节点名保持一致
public List<Person> getPerson() {
return person;
}
public void setPerson(List<Person> person) {
this.person = person;
}
@Override
public String toString() {
return "Group [person=" + person + "]";
}
}
测试代码
public void parseRepeatItem() {
String xmlFileNmae = "PersonGroup.xml";
InputStream ins = ClassLoader.getSystemResourceAsStream(xmlFileNmae);
XStream xstream = new XStream(new StaxDriver());
xstream.alias("group", Group.class);
Class<?>[] classes = new Class[] { Group.class};
xstream.allowTypes(classes);
xstream.addImplicitCollection(Group.class, "person", Person.class); //加上这个就可以解析重复元素
Group group = (Group) xstream.fromXML(ins);
System.out.println(group);
}