从一个实例看jaxb的强大
http://zyl.iteye.com/blog/33729
讀取xml對于應用軟件來說是一個必不可少的工作,當然現在的jdk也提供了很好的處理xml方式,讀寫xml的庫也挺多,包括有名的dom4j,不管使用任何的代碼庫,對于xml只是一個解析工作而已,不能馬上綁定到java 對象。對于對象,每次都需要set 或者get相應的屬性,當然也可以使用map 來保存xml配置。
??? 于是,一種新的處理方式用于對象和xml之間的映射就變得非常需要,還好sun提供了jaxb,一種很方便的方式來處理java對象和xml內容。下面通過一個實例來體會一下。
??? 看一下如下的xml
<?xml version="1.0"?>
<customer id="No1">
??? <name>Alice Smith</name>
??? <address>
??????? <street>123 Maple Street</street>
??????? <city>Cambridge</city>
??????? <zip>12345</zip>
??? </address>
</customer>
別忘了生成相應的xsd,或者dtd文件,這是主要的配置:
xsd:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
??
??? <xs:complexType name="Customer">
????? <xs:sequence>
???????? <xs:element name="address" type="Address"/>
???????? <xs:element name="name" type="xs:string"/>
????? </xs:sequence>
?????? <xs:attribute name="id" type="xs:string"/>??????
??? </xs:complexType>
??
????? <xs:complexType name="Address">
????? <xs:sequence>
???????? <xs:element name="street" type="xs:string"/>
???????? <xs:element name="city" type="xs:string"/>
???????? <xs:element name="zip" type="ZipCodeType"/>
?????? </xs:sequence>
?? </xs:complexType>
?
??? <xs:simpleType name="ZipCodeType">
????? <xs:restriction base="xs:integer">
???????? <xs:minInclusive value="10000"/>
???????? <xs:maxInclusive value="99999"/>
????? </xs:restriction>
??? </xs:simpleType>
??? <xs:element name="customer" type="Customer"/>
??? <xs:element name="address" type="Address"/>
</xs:schema>
需要映射兩個java對象,CustomerBo和AddressBo
java 對象可以通過xjc來生成。
或者自己定義(但需要增加相應的java注釋,如@XmlAccessorType,@XmlType,這是給引擎使用的)
所以一般通過xjd自動生成
@XmlAccessorType(AccessType.FIELD)
@XmlType(name = "Customer", propOrder = {
??? "address",
??? "customerName"
})
public class CustomerBo {
??? protected Address address;
??? @XmlElement(name = "name")
??? protected String customerName;
??? @XmlAttribute
??? protected String id;
??? public Address getAddress() {
??????? return address;
??? }
??? public String getCustomerName() {
??????? return customerName;
??? }
??? public String getId() {
??????? return id;
??? }
??? public void setAddress(Address value) {
??????? this.address = value;
??? }
??? public void setCustomerName(String value) {
??????? this.customerName = value;
??? }
??? public void setId(String value) {
??????? this.id = value;
??? }
}
public class Address {
??? protected String street;
??? protected String city;
??? @XmlElement(name = "zip")
??? protected BigInteger zipCode;
??? public String getStreet() {
??????? return street;
??? }
??? public void setStreet(String value) {
??????? this.street = value;
??? }
??? public String getCity() {
??????? return city;
??? }
??? public void setCity(String value) {
??????? this.city = value;
??? }
??? public BigInteger getZipCode() {
??????? return zipCode;
??? }
??? public void setZipCode(BigInteger value) {
??????? this.zipCode = value;
??? }
}
定義jxb綁定文件:
<jxb:bindings version="1.0"
?????????????? xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
?????????????? xmlns:xs="http://www.w3.org/2001/XMLSchema">
?? <jxb:bindings schemaLocation="customer.xsd" node="/xs:schema">??
?????????
?? <jxb:globalBindings
???????? fixedAttributeAsConstantProperty="false"
???????? collectionType="java.util.Vector"
???????? typesafeEnumBase="xs:NCName"
???????? choiceContentProperty="false"
???????? typesafeEnumMemberName="generateError"
???????? enableFailFastCheck="false"?
???????? generateIsSetMethod="false"
???????? underscoreBinding="asCharInWord"/>
?? <jxb:schemaBindings>
????? <jxb:package name="mycompany.demo">
??????? <jxb:javadoc><![CDATA[<body>Package level documentation for generated package mycompany.demo.</body>]]>
??????? </jxb:javadoc>
????? </jxb:package>
????? <jxb:nameXmlTransform>
??????? <jxb:elementName suffix="Element"/>
????? </jxb:nameXmlTransform>
??? </jxb:schemaBindings>?
??? //需要綁定的元素
?? <jxb:bindings node="//xs:complexType[@name='Customer']">
?????? //綁定的類
????? <jxb:class name="CustomerBo">
??????? <jxb:javadoc>A <b>todo..</jxb:javadoc>
????? </jxb:class>
????? <jxb:bindings node=".//xs:element[@name='name']">
?????????? //綁定的屬性
?????????? <jxb:property name="customerName"/>
??????? </jxb:bindings>
??? </jxb:bindings>?
????????
??? <jxb:bindings node="//xs:complexType[@name='Address']">
????? <jxb:class name="AddressBo">
??????? <jxb:javadoc><![CDATA[First line of documentation for a <b>Address</b>.]]></jxb:javadoc>
????? </jxb:class>
????? <jxb:bindings node=".//xs:element[@name='zip']">
???????? <jxb:property name="zipCode"/>
????? </jxb:bindings>
??? </jxb:bindings>
???????????
?? </jxb:bindings>
</jxb:bindings>
??? 看著比較復雜,其實挺好理解,當然可以不需要這個綁定文件,也可以綁定相應的java 類,但需要元素名稱和類名稱完全一致,而且屬性也要一致。
??? 看一下jaxb是如何來讀入xml的:
??????? //主要的環境類,主要讀取ObjectFactory這個類,這是由xjc生成的。
??????? JAXBContext jc = JAXBContext.newInstance("mycompany.demo");
??????? Unmarshaller u = jc.createUnmarshaller();
??????? JAXBElement customerE = (JAXBElement) u.unmarshal(new FileInputStream(
??????????????????????????????? "customer.xml"));
??????? CustomerBo bo = (CustomerBo) customerE.getValue();
??? 就是這么簡單
??? 寫入也比較簡單:
??????? JAXBContext jc = JAXBContext.newInstance("mycompany.demo");
??????? Marshaller marshaller=jc.createMarshaller();
??????? marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
??????? customerE.setValue(bo);
??????? marshaller.marshal( customerE,new FileOutputStream("test.xml"));
?
??? 在webservices中jaxb的作用是明顯的,當然也有不方便的地方,比如定義binding.jaxb文件時,如果沒有工具支持,手工寫,還是比較困難。
- 2006-11-11 20:22:58
- 瀏覽 32307
- 評論(13)
- 論壇回復 / 瀏覽 (13 / 26330)
- 分類:企業架構
- 相關推薦
評論
13 樓 pancras 2007-04-10?? 請問需要映射的兩個java對象是怎么確定的?是自己寫的,還是工具生成的?生成幾個依據是什么?挺感興趣的。比較有意思?能有在深入點的例子嗎?感謝樓主分享!還有,你那個頭像挺逗的! 12 樓 glchengang 2006-12-01?? 用過jaxb,不過當時發現它不支持有繼承結構的類的綁定,于是棄用了。
也許是自己對它了解不深吧。 11 樓 ryan 2006-11-17?? 引用 或者自己定義(但需要增加相應的java注釋,如@XmlAccessorType,@XmlType,這是給引擎使用的)
這里的@XmlAccessorType,@XmlType 似乎只是for "Java-toSchema" ,用J2SE5.0中的元數據注釋(Annotation)。
以前用過JAXB1.0,通過xjc會生成許多的Impl代碼。但是今天使用了JDK5.0和JAXB2.0,發現一張xsd只是生成了一個ObjectFactory.java和xml schema中的root兩個對象。十分詫異!難道2.0不需要那些自動生成的Impl代碼了么?
請各位大師指點! 10 樓 zyl 2006-11-15?? guoshiguan 寫道 看了樓主的文章,受益了, 不過還是有兩個問題
-------------------------------
需要映射兩個java對象,CustomerBo和AddressBo
java 對象可以通過xjc來生成。
或者自己定義(但需要增加相應的java注釋,如@XmlAccessorType,@XmlType,這是給引擎使用的)
所以一般通過xjd自動生成
一個java對像要用兩種工具生成嗎,是什么工具,能不能告訴我全名啊,。
---------------------------------------
別忘了生成相應的xsd,或者dtd文件,
這個東東要用什么東東成生,
---------------------------------------
JAXBContext jc = JAXBContext.newInstance("mycompany.demo");
mycompany.demo是什么東東
不要意思打錯了,是jaxb 自帶的xjc命令,也支持ant task。根據schema生成相應的java源代碼
xsd,可以通過jaxb的schemagen來生成
mycompany.demo 表示package 名稱 9 樓 zyl 2006-11-15?? 想不到有那么多人關注,我只是在學習jaxb當中,有幾點需要說明一下:
??
?? jaxb,不只是一個單純的工具庫,感覺功能比較強大,需要和其他的jaxp相互協作。
?? jaxb關注的方面更廣,能處理更為復雜的xml,
看一下以下代碼就可以知道:
?? 代碼1,處理xpath
?? JAXBXpath jaxbXpath = new JAXBXpath(doc, binder);
?? (USAddress) jaxbXpath.evaluate("/purchaseOrder/shipTo");
?
?? 代碼2,直接更新xml
?? Binder<Node> binder=JAXBContext.createBinder()
?? JAXBElement<Items.Item> itemE = binder.unmarshal(
??????????????????? node,
??????????????????? Items.Item.class);
?? binder.Items.Item item = itemE.getValue();
?? item.setComment("qualifies for free shipping");
??? binder.updateXML(item);
當然為了處理復雜的xml,其復雜的配置也是不可少的。
xstream 我也了解過,不過大多數情況下我只是用來作為java Serializable 而使用。
對于處理一些比較簡單的xml,xstream 是比較方便。
感覺兩者的目的不太一致。有興趣的可以去看看sun的jwsdp帶的相關例子
8 樓 pig345 2006-11-14?? 不好意思,我這里FCKeditor出錯,連發了2次 7 樓 pig345 2006-11-14?? 以前自己寫,后來用過apache的betwixt,感覺比這里說的jaxb簡單的多。 6 樓 pig345 2006-11-14?? 以前自己寫,后來用過apache的betwixt,感覺比這里說的jaxb簡單的多。 5 樓 lordhong 2006-11-14?? xmx0632 寫道 貼個xstream的:)
Java代碼 ?
大哥,你手真快!。。。上面的DateReader應該是DataReader吧 4 樓 guoshiguan 2006-11-14?? 看了樓主的文章,受益了, 不過還是有兩個問題
-------------------------------
需要映射兩個java對象,CustomerBo和AddressBo
java 對象可以通過xjc來生成。
或者自己定義(但需要增加相應的java注釋,如@XmlAccessorType,@XmlType,這是給引擎使用的)
所以一般通過xjd自動生成
一個java對像要用兩種工具生成嗎,是什么工具,能不能告訴我全名啊,。
---------------------------------------
別忘了生成相應的xsd,或者dtd文件,
這個東東要用什么東東成生,
---------------------------------------
JAXBContext jc = JAXBContext.newInstance("mycompany.demo");
mycompany.demo是什么東東 3 樓 zhangqidi 2006-11-14?? 一直用JiBX,覺得很好用,只要xml文件配置一下就ok了
2 樓 xmx0632 2006-11-13?? 貼個xstream的:)
Java代碼 ?
?
總結
以上是生活随笔為你收集整理的从一个实例看jaxb的强大的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单使用JDOM解析XML
- 下一篇: JiBX初步