JAXB(Java Architecture for XML Binding)是JDK的一部分,用于Object <-> XML的转换(有点类似于.NET中的XML序列化)。
1、创建XSD
可以使用任何工具生成XSD工具,比如XMLSPY。eclipse也提供了相关的jaxb插件,File -> New -> XML Schema File
文件命名为order.xsd,eclipse中也提供了xsd可视化编辑工具
当然,你要是很NB,对xsd结构倒背如流的话,完全也可以纯手写。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- edited with XMLSpy v2013 (http://www.altova.com) by () --> 3 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 4 <xs:element name="Order"> 5 <xs:annotation> 6 <xs:documentation>Comment describing your root element</xs:documentation> 7 </xs:annotation> 8 <xs:complexType> 9 <xs:sequence> 10 <xs:element name="OrderNo" type="xs:string"/> 11 <xs:element name="OrderDateTime" type="xs:dateTime"/> 12 <xs:element name="CustomerName" type="xs:string"/> 13 <xs:element name="OrderItems"> 14 <xs:complexType> 15 <xs:sequence> 16 <xs:element name="Produdct" maxOccurs="unbounded"> 17 <xs:complexType> 18 <xs:sequence> 19 <xs:element name="ProductNo" type="xs:string"/> 20 <xs:element name="ProductName" type="xs:string"/> 21 <xs:element name="Price" type="xs:float"/> 22 <xs:element name="Amount" type="xs:int"/> 23 </xs:sequence> 24 </xs:complexType> 25 </xs:element> 26 </xs:sequence> 27 </xs:complexType> 28 </xs:element> 29 </xs:sequence> 30 </xs:complexType> 31 </xs:element> 32 </xs:schema>
上面是Order.xsd的内容
2、根据XSD生成示例Xml
在XSD文件上右击 -> Generate -> XmlFile
会弹出一个框:
Prefix这里,如果不需要,可以参考上图自行清空,如果一些可选节点也需要生成示例数据,上图中的Create optional attributes、Create optional elements这二项也勾选上。
生成的order.xml内容如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--Sample XML file generated by XMLSpy v2013 (http://www.altova.com)--> 3 <Order xsi:noNamespaceSchemaLocation="order.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4 <OrderNo>0000001</OrderNo> 5 <OrderDateTime>2001-12-17T09:30:47Z</OrderDateTime> 6 <CustomerName>jimmy</CustomerName> 7 <OrderItems> 8 <Produdct> 9 <ProductNo>P-01</ProductNo> 10 <ProductName>Book</ProductName> 11 <Price>1.14159E0</Price> 12 <Amount>1</Amount> 13 </Produdct> 14 <Produdct> 15 <ProductNo>P-02</ProductNo> 16 <ProductName>iPhone 5C</ProductName> 17 <Price>3.14159E0</Price> 18 <Amount>2</Amount> 19 </Produdct> 20 </OrderItems> 21 </Order>
3、根据xsd生成java类
同样在xsd上右击 -> Generate -> JAXB Classes... 剩下的事情,大家都知道了
1 // 2 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 3 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 4 // Any modifications to this file will be lost upon recompilation of the source schema. 5 // Generated on: 2014.01.24 at 11:09:15 ���� CST 6 // 7 8 9 package model; 10 11 import java.util.ArrayList; 12 import java.util.List; 13 import javax.xml.bind.annotation.XmlAccessType; 14 import javax.xml.bind.annotation.XmlAccessorType; 15 import javax.xml.bind.annotation.XmlElement; 16 import javax.xml.bind.annotation.XmlRootElement; 17 import javax.xml.bind.annotation.XmlSchemaType; 18 import javax.xml.bind.annotation.XmlType; 19 import javax.xml.datatype.XMLGregorianCalendar; 20 21 22 /** 23 * <p>Java class for anonymous complex type. 24 * 25 * <p>The following schema fragment specifies the expected content contained within this class. 26 * 27 * <pre> 28 * <complexType> 29 * <complexContent> 30 * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 31 * <sequence> 32 * <element name="OrderNo" type="{http://www.w3.org/2001/XMLSchema}string"/> 33 * <element name="OrderDateTime" type="{http://www.w3.org/2001/XMLSchema}dateTime"/> 34 * <element name="CustomerName" type="{http://www.w3.org/2001/XMLSchema}string"/> 35 * <element name="OrderItems"> 36 * <complexType> 37 * <complexContent> 38 * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 39 * <sequence> 40 * <element name="Produdct" maxOccurs="unbounded"> 41 * <complexType> 42 * <complexContent> 43 * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 44 * <sequence> 45 * <element name="ProductNo" type="{http://www.w3.org/2001/XMLSchema}string"/> 46 * <element name="ProductName" type="{http://www.w3.org/2001/XMLSchema}string"/> 47 * <element name="Price" type="{http://www.w3.org/2001/XMLSchema}float"/> 48 * <element name="Amount" type="{http://www.w3.org/2001/XMLSchema}int"/> 49 * </sequence> 50 * </restriction> 51 * </complexContent> 52 * </complexType> 53 * </element> 54 * </sequence> 55 * </restriction> 56 * </complexContent> 57 * </complexType> 58 * </element> 59 * </sequence> 60 * </restriction> 61 * </complexContent> 62 * </complexType> 63 * </pre> 64 * 65 * 66 */ 67 @XmlAccessorType(XmlAccessType.FIELD) 68 @XmlType(name = "", propOrder = { 69 "orderNo", 70 "orderDateTime", 71 "customerName", 72 "orderItems" 73 }) 74 @XmlRootElement(name = "Order") 75 public class Order { 76 77 @XmlElement(name = "OrderNo", required = true) 78 protected String orderNo; 79 @XmlElement(name = "OrderDateTime", required = true) 80 @XmlSchemaType(name = "dateTime") 81 protected XMLGregorianCalendar orderDateTime; 82 @XmlElement(name = "CustomerName", required = true) 83 protected String customerName; 84 @XmlElement(name = "OrderItems", required = true) 85 protected Order.OrderItems orderItems; 86 87 /** 88 * Gets the value of the orderNo property. 89 * 90 * @return 91 * possible object is 92 * {@link String } 93 * 94 */ 95 public String getOrderNo() { 96 return orderNo; 97 } 98 99 /** 100 * Sets the value of the orderNo property. 101 * 102 * @param value 103 * allowed object is 104 * {@link String } 105 * 106 */ 107 public void setOrderNo(String value) { 108 this.orderNo = value; 109 } 110 111 /** 112 * Gets the value of the orderDateTime property. 113 * 114 * @return 115 * possible object is 116 * {@link XMLGregorianCalendar } 117 * 118 */ 119 public XMLGregorianCalendar getOrderDateTime() { 120 return orderDateTime; 121 } 122 123 /** 124 * Sets the value of the orderDateTime property. 125 * 126 * @param value 127 * allowed object is 128 * {@link XMLGregorianCalendar } 129 * 130 */ 131 public void setOrderDateTime(XMLGregorianCalendar value) { 132 this.orderDateTime = value; 133 } 134 135 /** 136 * Gets the value of the customerName property. 137 * 138 * @return 139 * possible object is 140 * {@link String } 141 * 142 */ 143 public String getCustomerName() { 144 return customerName; 145 } 146 147 /** 148 * Sets the value of the customerName property. 149 * 150 * @param value 151 * allowed object is 152 * {@link String } 153 * 154 */ 155 public void setCustomerName(String value) { 156 this.customerName = value; 157 } 158 159 /** 160 * Gets the value of the orderItems property. 161 * 162 * @return 163 * possible object is 164 * {@link Order.OrderItems } 165 * 166 */ 167 public Order.OrderItems getOrderItems() { 168 return orderItems; 169 } 170 171 /** 172 * Sets the value of the orderItems property. 173 * 174 * @param value 175 * allowed object is 176 * {@link Order.OrderItems } 177 * 178 */ 179 public void setOrderItems(Order.OrderItems value) { 180 this.orderItems = value; 181 } 182 183 184 /** 185 * <p>Java class for anonymous complex type. 186 * 187 * <p>The following schema fragment specifies the expected content contained within this class. 188 * 189 * <pre> 190 * <complexType> 191 * <complexContent> 192 * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 193 * <sequence> 194 * <element name="Produdct" maxOccurs="unbounded"> 195 * <complexType> 196 * <complexContent> 197 * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 198 * <sequence> 199 * <element name="ProductNo" type="{http://www.w3.org/2001/XMLSchema}string"/> 200 * <element name="ProductName" type="{http://www.w3.org/2001/XMLSchema}string"/> 201 * <element name="Price" type="{http://www.w3.org/2001/XMLSchema}float"/> 202 * <element name="Amount" type="{http://www.w3.org/2001/XMLSchema}int"/> 203 * </sequence> 204 * </restriction> 205 * </complexContent> 206 * </complexType> 207 * </element> 208 * </sequence> 209 * </restriction> 210 * </complexContent> 211 * </complexType> 212 * </pre> 213 * 214 * 215 */ 216 @XmlAccessorType(XmlAccessType.FIELD) 217 @XmlType(name = "", propOrder = { 218 "produdct" 219 }) 220 public static class OrderItems { 221 222 @XmlElement(name = "Produdct", required = true) 223 protected List<Order.OrderItems.Produdct> produdct; 224 225 /** 226 * Gets the value of the produdct property. 227 * 228 * <p> 229 * This accessor method returns a reference to the live list, 230 * not a snapshot. Therefore any modification you make to the 231 * returned list will be present inside the JAXB object. 232 * This is why there is not a <CODE>set</CODE> method for the produdct property. 233 * 234 * <p> 235 * For example, to add a new item, do as follows: 236 * <pre> 237 * getProdudct().add(newItem); 238 * </pre> 239 * 240 * 241 * <p> 242 * Objects of the following type(s) are allowed in the list 243 * {@link Order.OrderItems.Produdct } 244 * 245 * 246 */ 247 public List<Order.OrderItems.Produdct> getProdudct() { 248 if (produdct == null) { 249 produdct = new ArrayList<Order.OrderItems.Produdct>(); 250 } 251 return this.produdct; 252 } 253 254 255 /** 256 * <p>Java class for anonymous complex type. 257 * 258 * <p>The following schema fragment specifies the expected content contained within this class. 259 * 260 * <pre> 261 * <complexType> 262 * <complexContent> 263 * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 264 * <sequence> 265 * <element name="ProductNo" type="{http://www.w3.org/2001/XMLSchema}string"/> 266 * <element name="ProductName" type="{http://www.w3.org/2001/XMLSchema}string"/> 267 * <element name="Price" type="{http://www.w3.org/2001/XMLSchema}float"/> 268 * <element name="Amount" type="{http://www.w3.org/2001/XMLSchema}int"/> 269 * </sequence> 270 * </restriction> 271 * </complexContent> 272 * </complexType> 273 * </pre> 274 * 275 * 276 */ 277 @XmlAccessorType(XmlAccessType.FIELD) 278 @XmlType(name = "", propOrder = { 279 "productNo", 280 "productName", 281 "price", 282 "amount" 283 }) 284 public static class Produdct { 285 286 @XmlElement(name = "ProductNo", required = true) 287 protected String productNo; 288 @XmlElement(name = "ProductName", required = true) 289 protected String productName; 290 @XmlElement(name = "Price") 291 protected float price; 292 @XmlElement(name = "Amount") 293 protected int amount; 294 295 /** 296 * Gets the value of the productNo property. 297 * 298 * @return 299 * possible object is 300 * {@link String } 301 * 302 */ 303 public String getProductNo() { 304 return productNo; 305 } 306 307 /** 308 * Sets the value of the productNo property. 309 * 310 * @param value 311 * allowed object is 312 * {@link String } 313 * 314 */ 315 public void setProductNo(String value) { 316 this.productNo = value; 317 } 318 319 /** 320 * Gets the value of the productName property. 321 * 322 * @return 323 * possible object is 324 * {@link String } 325 * 326 */ 327 public String getProductName() { 328 return productName; 329 } 330 331 /** 332 * Sets the value of the productName property. 333 * 334 * @param value 335 * allowed object is 336 * {@link String } 337 * 338 */ 339 public void setProductName(String value) { 340 this.productName = value; 341 } 342 343 /** 344 * Gets the value of the price property. 345 * 346 */ 347 public float getPrice() { 348 return price; 349 } 350 351 /** 352 * Sets the value of the price property. 353 * 354 */ 355 public void setPrice(float value) { 356 this.price = value; 357 } 358 359 /** 360 * Gets the value of the amount property. 361 * 362 */ 363 public int getAmount() { 364 return amount; 365 } 366 367 /** 368 * Sets the value of the amount property. 369 * 370 */ 371 public void setAmount(int value) { 372 this.amount = value; 373 } 374 375 } 376 377 } 378 379 }
上面是根据刚才的order.xsd生成的order类,package名称是model(当然生成java class的时候,你可以根据实际情况,设成任何自己需要的package名)
同时还会生成一个ObjectFactory类:
1 // 2 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 3 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 4 // Any modifications to this file will be lost upon recompilation of the source schema. 5 // Generated on: 2014.01.24 at 11:09:15 ���� CST 6 // 7 8 9 package model; 10 11 import javax.xml.bind.annotation.XmlRegistry; 12 13 14 /** 15 * This object contains factory methods for each 16 * Java content interface and Java element interface 17 * generated in the model package. 18 * <p>An ObjectFactory allows you to programatically 19 * construct new instances of the Java representation 20 * for XML content. The Java representation of XML 21 * content can consist of schema derived interfaces 22 * and classes representing the binding of schema 23 * type definitions, element declarations and model 24 * groups. Factory methods for each of these are 25 * provided in this class. 26 * 27 */ 28 @XmlRegistry 29 public class ObjectFactory { 30 31 32 /** 33 * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: model 34 * 35 */ 36 public ObjectFactory() { 37 } 38 39 /** 40 * Create an instance of {@link Order.OrderItems } 41 * 42 */ 43 public Order.OrderItems createOrderOrderItems() { 44 return new Order.OrderItems(); 45 } 46 47 /** 48 * Create an instance of {@link Order } 49 * 50 */ 51 public Order createOrder() { 52 return new Order(); 53 } 54 55 /** 56 * Create an instance of {@link Order.OrderItems.Produdct } 57 * 58 */ 59 public Order.OrderItems.Produdct createOrderOrderItemsProdudct() { 60 return new Order.OrderItems.Produdct(); 61 } 62 63 }
4、Object <-> XML 的示例代码
1 public void testXmlToObj() { 2 JAXBContext jc; 3 try { 4 jc = JAXBContext.newInstance("model"); 5 Unmarshaller u = jc.createUnmarshaller(); 6 String xmlFilePath = AppTest.class.getResource("/").getPath() 7 + "order.xml"; 8 System.out.println(xmlFilePath); 9 Order order = (Order) u.unmarshal(new File(xmlFilePath)); 10 assertTrue(order.getOrderNo().equals("0000001")); 11 assertTrue(order.getCustomerName().equals("jimmy")); 12 for (int i = 0; i < order.getOrderItems().getProdudct().size(); i++) { 13 System.out.println(getProductDesc(order.getOrderItems() 14 .getProdudct().get(i))); 15 } 16 } catch (Exception e) { 17 e.printStackTrace(); 18 } 19 } 20 21 public void testObjToXml() { 22 try { 23 ObjectFactory of = new ObjectFactory(); 24 Order order = of.createOrder(); 25 Order.OrderItems orderItems = of.createOrderOrderItems(); 26 27 Order.OrderItems.Produdct product1 = new Order.OrderItems.Produdct(); 28 product1.setProductNo("A-01"); 29 product1.setProductName("Car"); 30 product1.setPrice(1000000); 31 product1.setAmount(1); 32 33 orderItems.getProdudct().add(product1); 34 35 Order.OrderItems.Produdct product2 = new Order.OrderItems.Produdct(); 36 product2.setProductNo("B-01"); 37 product2.setProductName("Book"); 38 product2.setPrice(200); 39 product2.setAmount(2); 40 41 orderItems.getProdudct().add(product2); 42 43 order.setOrderItems(orderItems); 44 45 JAXBContext jc = JAXBContext.newInstance("model"); 46 Marshaller ms = jc.createMarshaller(); 47 ms.setProperty("jaxb.encoding", "UTF-8"); 48 ms.setProperty("jaxb.formatted.output", true); 49 String xmlFilePath = AppTest.class.getResource("/").getPath() 50 + "order_new.xml"; 51 ms.marshal(order, new File(xmlFilePath)); 52 53 System.out.println("testObjToXml"); 54 } catch (Exception e) { 55 e.printStackTrace(); 56 57 } 58 }
示例源代码下载:jaxb-helloworld.zip (注:这是一个maven工程,命令行下直接mvn clean test,就可以测试)