用Apache Commons Betwixt2 在XML與Java對象之間相互轉換
如果你需要做XML與Java對象之間相互轉換,apache betwixt2是一個不二的選擇。
官方主頁:[url]http://commons.apache.org/betwixt/[/url]
目前最新版本是0.8.
以前我用XStream,但是對比起來還是沒apache betwixt2來得容易。下面給些例子出來。
/**
* 測試Bean
*/
public class PersonBean {
private String name;
private int age;
public PersonBean() {
}
public PersonBean(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "PersonBean{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
* 測試Bean
*/
public class PersonBean {
private String name;
private int age;
public PersonBean() {
}
public PersonBean(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "PersonBean{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
import java.io.StringReader;
import org.apache.commons.betwixt.io.BeanReader;
/**
* XML轉Java
*/
public class ReadExampleApp {
public static final void main(String args[]) throws Exception {
//創建一個讀取xml文件的流
StringReader xmlReader = new StringReader(
"<?xml version='1.0' ?><person><age>25</age><name>James Smith</name></person>");
//創建一個BeanReader實例,相當于轉換器
BeanReader beanReader = new BeanReader();
//配置BeanReader實例
beanReader.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
beanReader.getBindingConfiguration().setMapIDs(false); //不自動生成ID
//注冊要轉換對象的類,并指定根節點名稱
beanReader.registerBeanClass("person", PersonBean.class);
//將XML解析Java Object
PersonBean person = (PersonBean) beanReader.parse(xmlReader);
//在控制臺輸出對象
System.out.println(person);
}
}
import org.apache.commons.betwixt.io.BeanReader;
/**
* XML轉Java
*/
public class ReadExampleApp {
public static final void main(String args[]) throws Exception {
//創建一個讀取xml文件的流
StringReader xmlReader = new StringReader(
"<?xml version='1.0' ?><person><age>25</age><name>James Smith</name></person>");
//創建一個BeanReader實例,相當于轉換器
BeanReader beanReader = new BeanReader();
//配置BeanReader實例
beanReader.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
beanReader.getBindingConfiguration().setMapIDs(false); //不自動生成ID
//注冊要轉換對象的類,并指定根節點名稱
beanReader.registerBeanClass("person", PersonBean.class);
//將XML解析Java Object
PersonBean person = (PersonBean) beanReader.parse(xmlReader);
//在控制臺輸出對象
System.out.println(person);
}
}
運行結果:
PersonBean{name='James
Smith', age=25}
Process finished with exit code 0
Process finished with exit code 0
import betwixt.Person;
import org.apache.commons.betwixt.io.BeanWriter;
import org.xml.sax.SAXException;
import java.beans.IntrospectionException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Collection;
/**
* 將java對象轉換為xml,并輸出到文件
*/
public class WriteExampleApp {
public static final void main(String [] args) throws Exception {
//創建一個輸出流,將用來輸出Java轉換的XML文件
FileWriter outputWriter = new FileWriter("c:\\tttttttttt.txt");
//輸出XML的文件頭
outputWriter.write("<?xml version='1.0' ?>");
//創建一個BeanWriter實例,并將BeanWriter的輸出重定向到指定的輸出流
BeanWriter beanWriter = new BeanWriter(outputWriter);
//配置BeanWriter對象
beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
beanWriter.getBindingConfiguration().setMapIDs(false);
beanWriter.enablePrettyPrint();
Person person = new Person("阿牛", 21);
beanWriter.write(person);
//關閉輸出流
outputWriter.close();
}
}
import org.apache.commons.betwixt.io.BeanWriter;
import org.xml.sax.SAXException;
import java.beans.IntrospectionException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Collection;
/**
* 將java對象轉換為xml,并輸出到文件
*/
public class WriteExampleApp {
public static final void main(String [] args) throws Exception {
//創建一個輸出流,將用來輸出Java轉換的XML文件
FileWriter outputWriter = new FileWriter("c:\\tttttttttt.txt");
//輸出XML的文件頭
outputWriter.write("<?xml version='1.0' ?>");
//創建一個BeanWriter實例,并將BeanWriter的輸出重定向到指定的輸出流
BeanWriter beanWriter = new BeanWriter(outputWriter);
//配置BeanWriter對象
beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
beanWriter.getBindingConfiguration().setMapIDs(false);
beanWriter.enablePrettyPrint();
Person person = new Person("阿牛", 21);
beanWriter.write(person);
//關閉輸出流
outputWriter.close();
}
}
運行結果:
Process finished with exit code 0
(在C盤目錄下創建一個名叫tttttttttt.txt的文件。
import betwixt.Person;
import org.apache.commons.betwixt.io.BeanWriter;
import java.io.StringWriter;
/**
* 將Java對象轉換為XML,并獲取其字符串
*
* @author leizhimin 2008-9-18 14:36:49
*/
public class WriteStringExampleApp {
public static final void main(String [] args) throws Exception {
String reslutXml;
//創建一個輸出流,將用來輸出Java轉換的XML文件
StringWriter outputWriter = new StringWriter();
//輸出XML的文件頭
outputWriter.write("<?xml version='1.0' ?>");
//創建一個BeanWriter實例,并將BeanWriter的輸出重定向到指定的輸出流
BeanWriter beanWriter = new BeanWriter(outputWriter);
//配置BeanWriter對象
beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
beanWriter.getBindingConfiguration().setMapIDs(false);
beanWriter.enablePrettyPrint();
Person person = new Person("阿牛", 21);
beanWriter.write(person);
reslutXml = outputWriter.toString();
//關閉輸出流
outputWriter.close();
//控制臺輸出轉換結果的字符串
System.out.println(reslutXml);
}
}
import org.apache.commons.betwixt.io.BeanWriter;
import java.io.StringWriter;
/**
* 將Java對象轉換為XML,并獲取其字符串
*
* @author leizhimin 2008-9-18 14:36:49
*/
public class WriteStringExampleApp {
public static final void main(String [] args) throws Exception {
String reslutXml;
//創建一個輸出流,將用來輸出Java轉換的XML文件
StringWriter outputWriter = new StringWriter();
//輸出XML的文件頭
outputWriter.write("<?xml version='1.0' ?>");
//創建一個BeanWriter實例,并將BeanWriter的輸出重定向到指定的輸出流
BeanWriter beanWriter = new BeanWriter(outputWriter);
//配置BeanWriter對象
beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
beanWriter.getBindingConfiguration().setMapIDs(false);
beanWriter.enablePrettyPrint();
Person person = new Person("阿牛", 21);
beanWriter.write(person);
reslutXml = outputWriter.toString();
//關閉輸出流
outputWriter.close();
//控制臺輸出轉換結果的字符串
System.out.println(reslutXml);
}
}
運行結果:
<?xml
version='1.0' ?> <Person>
<addList/>
<age>21</age>
<name>阿牛</name>
</Person>
Process finished with exit code 0
<addList/>
<age>21</age>
<name>阿牛</name>
</Person>
Process finished with exit code 0
總結:
betwixt功能強大,使用簡單,是快速開發不二的選擇。
BeanWriter相當于一個雙向轉換器工廠,但是這個工廠需要裝配,并且它是非線程安全的。
BeanWriter有很多配置項,可以將對象的成員裝配成xml元素的屬性。也可以改寫元素屬性的名字。默認情況下元素的名字與java成員的名字相同,根節點與java類名相同(不帶包名)。并且這些操作是雙向可逆的。太牛了吧!
BeanWriter還可以轉換格式不規范的xml文檔,比如節點無法有些不匹配,或者無法完全映射到對象上的xml,這些都不會出錯,并且當節點為null的時候,轉換也不用做特殊處理,非常簡單。
BeanWriter在將Java轉換為xml時,Java對象可以是復雜對象,對象之中嵌套對象,如果復雜對象的某個成員比如類型為另外一個對象為null時,還可以選擇是否在生成xml的時候輸出該節點。如果期望輸出,則輸出一個對應復雜對象成員的子元素,里面的元素值全為空。
這些特性是XStream所無法相比的。有關速度效率的問題,還沒測試過。不過一般應用沒有發現問題,除非你的xml幾百M。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!