XML和Java Bean互相转换是一个很有用的功能,因为两者有着前后合作的关系,但解析的过程比较痛苦。下面介绍如何进行XML和Java Bean的互相转换。

  最近项目中用到了xml和java bean的转换

  用到xml的时候我们需要遍历解析。。。然后将解析的值放入声明好的java bean,过程很痛苦,结果很美好

  我们能不能直接从xml转化到java bean呢,或者直接成java bean转化到xml呢?

  答案是OK的

  使用jar包:org.nuxeo.common.xmap

  写个小例子

  XML

  1.< ?xml version="1.0" encoding="UTF-8"?>

  2.< books>

  3.< book no="1">

  4.< title>java是傻逼< /title>

  5.< subject>java< /subject>

  6.< subject>xml< /subject>

  7.< price>10< /price>

  8.< /book>

  9.< book no="2">

  10.< title>c++程序设计< /title>

  11.< subject>C++< /subject>

  12.< subject>c< /subject>

  13.< price>10< /price>

  14.< /book>

  15.< /books>

  Books类

  16.import java.util.ArrayList;

  17.import java.util.List;

  18.

  19.import org.nuxeo.common.xmap.annotation.XNodeList;

  20.import org.nuxeo.common.xmap.annotation.XObject;

  21.

  22.@XObject(value = "books")

  23.public class Books {

  24. @XNodeList(value = "book", type = ArrayList.class, componentType = Book.class)

  25. private List< Book> book;

  26.

  27. public List< Book> getBook() {

  28. return book;

  29. }

  30.

  31. public void setBook(List< Book> book) {

  32. this.book = book;

  33. }

  34.

  35. public void addBook(Book b){

  36. if(book==null){

  37. book=new ArrayList< Book>();

  38. }

  39. book.add(b);

  40. }

  41.}

  42.

  Book类

  43.import java.util.ArrayList;

  44.import java.util.List;

  45.

  46.import org.nuxeo.common.xmap.annotation.XNode;

  47.import org.nuxeo.common.xmap.annotation.XNodeList;

  48.import org.nuxeo.common.xmap.annotation.XObject;

  49.

  50.

  51.@XObject

  52.public class Book {

  53. @XNode("title")

  54. private String title;

  55.

  56. @XNode("@no")

  57. private String no;

  58.

  59. @XNodeList(value = "subject", type = ArrayList.class, componentType = String.class)

  60. private List< String> subjects;

  61.

  62. @XNode("price")

  63. private int price;

  64.

  65. public String getTitle() {

  66. return title;

  67. }

  68.

  69. public void setTitle(String title) {

  70. this.title = title;

  71. }

  72.

  73. public List< String> getSubjects() {

  74. return subjects;

  75. }

  76.

  77. public void setSubjects(List< String> subjects) {

  78. this.subjects = subjects;

  79. }

  80.

  81. public int getPrice() {

  82. return price;

  83. }

  84.

  85. public void setPrice(int price) {

  86. this.price = price;

  87. }

  88.

  89. public String getNo() {

  90. return no;

  91. }

  92.

  93. public void setNo(String no) {

  94. this.no = no;

  95. }

  96.}

  97.

  测试类:

  98.import java.util.ArrayList;

  99.import java.util.List;

  100.

  101.import org.nuxeo.common.xmap.XMap;

  102.

  103.

  104.public class XmapTest {

  105. public static void main(String[] args) {

  106. try {

  107. //声明一组书的根节点

  108. Books books=new Books();

  109.

  110. //声明一本书

  111. Book book=new Book();

  112. //书的类型

  113. List< String> sj=new ArrayList< String>();

  114. sj.add("java");

  115. sj.add("xml");

  116. //设置书节点的属性

  117. book.setPrice(10);

  118. book.setTitle("java是傻逼");

  119. book.setSubjects(sj);

  120. book.setNo("1");

  121.

  122. //将书节点添加到跟节点

  123. books.addBook(book);

  124.

  125. //声明一本书

  126. Book book2=new Book();

  127. //书的类型

  128. List< String> sj2=new ArrayList< String>();

  129. sj2.add("C++");

  130. sj2.add("c");

  131. //设置书节点的属性

  132. book2.setPrice(10);

  133. book2.setTitle("c++程序设计");

  134. book2.setSubjects(sj2);

  135. book2.setNo("2");

  136.

  137. //将书节点添加到跟节点

  138. books.addBook(book2);

  139.

  140. XMap xmp = new XMap();

  141. xmp.register(Books.class);

  142.

  143. List< String> filters = new ArrayList< String>();

  144.

  145. System.out.println(xmp.asXmlString(books, "UTF-8", filters, true));

  146. } catch (Exception e) {

  147. e.printStackTrace();

  148. }

  149. }

  150.}

  151.

  运行上面这个类就可以生成开头所看见的那个XML的内容

  解析xml

  152.xmap.register(Books.class);

  153. URL url = new File("book.xml").toURL();

  154. InputStream in = new FileInputStream(new File("book.xml"));

  155. Object[] result = (Object[]) xmap.loadAll(in);

  156.

  157.Books books=(Books)result[0];

  158.

  数据就完全autowire by name进入到了bean,某些情况下很好用(xml很整齐,每个节点的内容都一样,固定)

  XML和Java Bean互相转换就此实现。

 

两个需要注意的地方:1.Xmap包最新下载地址https://maven.nuxeo.org/用最新版本的就行。运行程序时需要把log4j的日志路径配好,否则会报错。s2Xmap需要依赖一个apache的xercesImpl.jar包下载地址http://download.csdn.net/detail/alice_0812/305407