日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从一个实例看jaxb的强大

發布時間:2024/4/17 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从一个实例看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 &lt;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文件時,如果沒有工具支持,手工寫,還是比較困難。

分享到: 幾個有用的靜態方面,用于審查代碼(aspect ... | 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代碼 ?
  • public?class?XStreamDateReader?{ ??
  • InputStream?in?=?XStreamDateReader.class.getResourceAsStream("data.xml");??
  • public class XStreamDateReader { InputStream in = XStreamDateReader.class.getResourceAsStream("data.xml");
    大哥,你手真快!。。。上面的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代碼 ?
  • public?class?Customer?{ ??
  • ??
  • ????protected?Address?address; ??
  • ??
  • ????protected?String?name; ??
  • ??
  • ????protected?String?id; ??
  • ???? ??
  • ????public?String?toString(){ ??
  • ????????return?id+?"?"?+?name?+?"@"?+?address; ??
  • ????} ??
  • } ??
  • ??
  • import?java.math.BigInteger; ??
  • ??
  • public?class?Address?{ ??
  • ??
  • ????protected?String?street; ??
  • ??
  • ????protected?String?city; ??
  • ??
  • ????protected?BigInteger?zip; ??
  • ??
  • ????public?String?toString(){ ??
  • ????????return?city+?"?"?+?street?+?"?"?+?zip; ??
  • ????} ??
  • } ??
  • ??
  • ??
  • import?java.io.InputStream; ??
  • ??
  • import?com.thoughtworks.xstream.XStream; ??
  • ??
  • public?class?XStreamDataReader?{ ??
  • ??
  • ????????public?static?void?main(String[]?args)?{ ??
  • ???? ??
  • ????????????XStream?xstream?=?new?XStream(); ??
  • ????????????xstream.alias("customer",?Customer.class); ??
  • ????????????xstream.alias("address",?Address.class); ??
  • ???????????? ??
  • ????????????xstream.useAttributeFor("id",?String.class); ??
  • ???????????? ??
  • ????????????InputStream?in?=?XStreamDataReader.class.getResourceAsStream("data.xml"); ??
  • ????????????Customer?bo?=?(Customer)xstream.fromXML(in); ??
  • ???????????? ??
  • ????????????System.out.println(bo); ??
  • ??
  • ????????????xstream.toXML(bo,????new?FileWriter("data1.xml"));//另存為... ??
  • ????????} ??
  • }??
  • public class Customer {protected Address address;protected String name;protected String id;public String toString(){return id+ " " + name + "@" + address;} }import java.math.BigInteger;public class Address {protected String street;protected String city;protected BigInteger zip;public String toString(){return city+ " " + street + " " + zip;} }import java.io.InputStream;import com.thoughtworks.xstream.XStream;public class XStreamDataReader {public static void main(String[] args) {XStream xstream = new XStream();xstream.alias("customer", Customer.class);xstream.alias("address", Address.class);xstream.useAttributeFor("id", String.class);InputStream in = XStreamDataReader.class.getResourceAsStream("data.xml");Customer bo = (Customer)xstream.fromXML(in);System.out.println(bo);xstream.toXML(bo, new FileWriter("data1.xml"));//另存為...} } 1 樓 lordhong 2006-11-13?? 看起來好麻煩啊!簡單用途的話XStream就可以了

    ?

    總結

    以上是生活随笔為你收集整理的从一个实例看jaxb的强大的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。