使用apche 的 betwixt,相关库为
Ø commons-beanutils.jar
Ø commons-betwixt-1.0-beta-1.jar
Ø commons-collections-3.2.1.jar
Ø commons-configuration-1.6.jar
Ø commons-digester.jar
Ø commons-lang-2.4.jar
Ø commons-logging.jar
比如解析如下XML:
<?xml version="1.0" encoding="UTF-8" ?> <class id="1" name="class one"> <students> <student name="Jime"> <score maths="80" /> </student> <student name="Abby"> <score maths="100" /> </student> </students> </class>
结构很简单,这里使用betwixt 方式进行解析。
首先封装XML 的元素信息,主要为3个类:
Class.java
public class Class {
private int id;
private String name;
private List<Student> students = new ArrayList<Student>();
/**
* Add a student.
* @param student
*/
public void addStudent(Student student){
this.students.add(student);
}
/**
* Remove a student.
* @param student
*/
public void removeStudent(Student student){
this.students.remove(student);
}
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the students
*/
public List<Student> getStudents() {
return students;
}
/**
* @param students the students to set
*/
public void setStudents(List<Student> students) {
this.students = students;
}
}
Student.java
public class Score {
private int mathScore;
/**
* @return the mathScore
*/
public int getMathScore() {
return mathScore;
}
/**
* @param mathScore the mathScore to set
*/
public void setMathScore(int mathScore) {
this.mathScore = mathScore;
}
}
都很简单,就不用多描述了。下面是每个类对应的XML 描述文件:
Class.betwixt:
<?xml version="1.0" encoding="UTF-8"?> <info primitiveTypes="attribute"> <element name="class"> <attribute name="id" property="id"/> <attribute name="name" property="name"/> <element name="students"> <element name="student" property="student"/> </element> <addDefaults/> </element> </info>
Student.betwixt:
<?xml version="1.0" encoding="UTF-8"?> <info primitiveTypes="attribute"> <element name="student"> <attribute name="name" property="name"/> <element name="score" property="score"/> <addDefaults/> </element> </info>
Score.betwixt:
<?xml version="1.0" encoding="UTF-8"?>
<info primitiveTypes="attribute">
<element name="score">
<attribute name="maths" property="mathScore"/>
<addDefaults/>
</element>
</info>
这些XML 文件名与类名相同,用来在XML 文件与实体类之间进行映射。具体的解析方法就很简单了。注意这些文件需要跟.java文件放到同一目录下。
public static Object fromXml(InputStream in, Class clazz)
throws XmlException {
BeanReader beanReader = new BeanReader();
Object object = null;
try {
beanReader.registerBeanClass(clazz);
beanReader.getXMLIntrospector().setWrapCollectionsInElement(true);
object = beanReader.parse(in);
} catch (Exception e) {
throw new XmlException(e);
}
return object;
}
使用fromXml 解析文件:
public static Class parseFromXml(String path) throws Exception {
FileInputStream in;
Class obj = null;
try {
in = new FileInputStream(path);
obj = (Class) XmlUtil.fromXml(in, Class.class);
} catch (FileNotFoundException e) {
throw new Exception(e);
} catch (Exception e) {
throw new Exception(e);
}
return obj;
}
输出为XML:
public static void toXml(Object object, OutputStream out)
throws Exception {
try {
BeanWriter beanWriter = new BeanWriter(out, "UTF-8");
beanWriter.enablePrettyPrint();
beanWriter.setIndent(" ");
beanWriter.setEndOfLine(System.getProperty("line.separator"));
beanWriter.writeXmlDeclaration("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
beanWriter.getXMLIntrospector().setWrapCollectionsInElement(true);
beanWriter.setWriteEmptyElements(false);
beanWriter.write(object);
beanWriter.close();
} catch (Exception e) {
throw new XmlException(e);
}
}
将Class 类的对象输出为XML:
public static void writeToXml(Object object, String path)
throws Exception {
try {
FileOutputStream out = new FileOutputStream(path);
XmlUtil.toXml(object, out);
out.close();
} catch (FileNotFoundException e) {
throw new Exception(e);
} catch (IOException e) {
e.printStackTrace();
}
}
完成XML 解析的过程很简单,就只有几句话而以,这对于大型复杂的XML 解析很有帮助,不需要亲自处理各种属性、元素等,因为各种.jar 文件已经封装好了。