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
上面是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>
Order.xml
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.java
上面是根据刚才的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 }
ObjectFactory.java
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 }
object xml
示例源代码下载:jaxb-helloworld.zip (注:这是一个maven工程,命令行下直接mvn clean test,就可以测试)
标签:java,String,JAXB,value,public,学习,return,Order,OrderItems From: https://blog.51cto.com/nethub/6564762