国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用JAXB生成一個XML文檔

2019-11-18 15:20:24
字體:
來源:轉載
供稿:網友

一個xml 模式(Schema)用XML語法表達了一個XML文檔的結構。J2EE的開發者也許會需要一個符合XML模式的XML文檔。java XML綁定架構(JAXB)提供了一個綁定編譯器,xjc,來從一個XML模式中生成Java類。用JAXB的xjc生成的Java類代表了在XML模式中不同的元素和復雜類型(complexType)。(一個復雜類型通過指定屬性和元素內的元素來提供對一個元素的限定)。一個符合XML模式的XML文檔可以從這些Java類中構建出來。

在這篇教程中,作者使用了JAXB用來從一個XML模式中生成Java類。這些Java類將會生成一個范例XML文檔。這篇文章由以下幾個部份組成:

1.預設置
2.概述
3.從XMl模式中生成Java類
4.從Java類中生成一個XML文檔

預設置
為了用JAXB從一個XML模式中生成Java類,JAXB API類庫和xjc工具應該存在CLASSPATH環境變量中。將Java Web服務開發包 (JWSDP) 1.5裝入一個安裝目錄中。將下列的.jar文件加入CLASSPATH環境變量中。
·<JWSDP>/jaxb/lib/jaxb-api.jar
·<JWSDP>/jaxb/lib/jaxb-impl.jar
·<JWSDP>/jaxb/lib/jaxb-libs.jar
·<JWSDP>/jaxb/lib/jaxb-xjc.jar
·<JWSDP>/jwsdp-shared/lib/namespace.jar
·<JWSDP>/jwsdp-shared/lib/jax-qname.jar
·<JWSDP>/jwsdp-shared/lib/relaxngDatatype.jar

<JWSDP>是Java Web服務開發包1.5的安裝目錄。把<JWSDP>/jaxb/bin加入PATH環境變量中。<JWSDP>/jaxb/bin目錄中包含了xjc編譯器。把<JWSDP>/jwsdp-shared/bin目錄加入到PATH環境變量中。<JWSDP>/jwsdp-shared/bin目錄中包含了setenv的批處理文件,它設置了JAVA_HOME, ANT_HOME和JWSDP_HOME這幾個環境變量。

概述
JAXB生成對應著XML頂層元素和頂層復雜類型元素 的Java類和接口。在一個XML模式中,一個元素由<xs:element/>表示,一個復雜類型元素由<xs:complexType/>表示。這篇教程列舉了一個能夠表示一篇在科學雜志上發表的文章的示例模式,同時這個示例模式將會被JAXB綁定編譯器編譯。XML模式,catalog.xsd,如下:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="catalog" type="catalogType"/>
<xsd:complexType name="catalogType">
  <xsd:sequence>
   <xsd:element ref="journal"  minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="section" type="xsd:string"/>
  <xsd:attribute name="publisher" type="xsd:string"/>
</xsd:complexType>
<xsd:element name="journal" type="journalType"/>
<xsd:complexType name="journalType">
  <xsd:sequence>
   <xsd:element ref="article"  minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
<xsd:element name="article" type="articleType"/>
<xsd:complexType name="articleType">
  <xsd:sequence>
   <xsd:element name="title" type="xsd:string"/>
   <xsd:element name="author" type="xsd:string"/>
  </xsd:sequence>
  <xsd:attribute name="level" type="xsd:string"/>
  <xsd:attribute name="date" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>


一些XML模式的構造不被JAXB支持。假如這些不被支持的構造包含在了模式中,那么當你試圖用xjc來生成Java類時將會報錯。下列模式元素不被支持:xs:any, xs:anyAttribute, xs:notation, xs:redefine, xs:key, xs:keyref, 和 xs:unique. 下列模式的屬性不被支持: complexType.abstract, element.abstract, element.substitutionGroup, xsi:type, complexType.block, complexType.final, element.block, element.final, schema.blockDefault, 和 schema.finalDefault.

生成Java類
xjc工具基于此模式來綁定一個模式到Java類。針對本文的示例模式來進行綁定的命令是:
>xjc catalog.xsd

xjc命令行接口的一些選項列在下表:
-nv        對于輸入的模式不執行嚴格的XML驗證
-b <file>        指定外部的綁定文件
-d <dir>        指定生成的文件的存放路徑
-p <pkg>        指定目標包
-classpath <arg>         指定classpath
-use-runtime <pkg>        impl.runtime包不被生成
-xmlschema        輸入的模式是一個W3C XML模式(默認)

對于示例模式catalog.xsd來說,xjc將會生成45個類,顯示在如下xjc的輸出中:
parsing a schema...
compiling a schema...
generatedimpl untimeErrorHandlerAdaptor.java
generatedimpl untimeMSVValidator.java
generatedimpl untimeNamespaceContext2.java
generatedimpl untimeUnmarshallableObject.java
generatedimpl untimeMarshallerImpl.java
generatedimpl untimeValidationContext.java
generatedimpl untimeUnmarshallerImpl.java
generatedimpl untimeDefaultJAXBContextImpl.java
generatedimpl untimeContentHandlerAdaptor.java
generatedimpl untimeGrammarInfoFacade.java
generatedimpl untimeUnmarshallingContext.java
generatedimpl untimeUnmarshallingEventHandlerAdaptor.java
generatedimpl untimeXMLSerializable.java
generatedimpl untimeDiscarder.java
generatedimpl untimePRefixCallback.java
generatedimpl untimeSAXMarshaller.java
generatedimpl untimeNamespaceContextImpl.java
generatedimpl untimeUnmarshallingEventHandler.java
generatedimpl untimeGrammarInfo.java
generatedimpl untimeInterningUnmarshallerHandler.java
generatedimpl untimeValidatableObject.java
generatedimpl untimeGrammarInfoImpl.java
generatedimpl untimeValidatingUnmarshaller.java
generatedimpl untimeValidatorImpl.java
generatedimpl untimeSAXUnmarshallerHandlerImpl.java
generatedimpl untimeXMLSerializer.java
generatedimpl untimeUtil.java
generatedimpl untimeSAXUnmarshallerHandler.java
generatedimpl untimeAbstractUnmarshallingEventHandlerImpl.java
generatedimplArticleImpl.java
generatedimplArticleTypeImpl.java
generatedimplCatalogImpl.java
generatedimplCatalogTypeImpl.java
generatedimplJAXBVersion.java
generatedimplJournalImpl.java
generatedimplJournalTypeImpl.java
generatedArticle.java
generatedArticleType.java
generatedCatalog.java
generatedCatalogType.java
generatedJournal.java
generatedJournalType.java
generatedObjectFactory.java
generatedgm.ser
generatedjaxb.properties

對于示例XML模式中的每個頂層xs:element和頂層xs:complexType,都對應地生成了一個Java接口和一個Java類。同時也創建了一個工廠類(ObjectFactory.java),包含了創建接口對象的方法。可以在在篇文章的示例代碼文件jaxb-java-resources.zip中找到ObjectFactory.java類。
Catalog.java是對應頂層元素catalog生成的接口。從模式的元素中生成的接口擴展了javax.xml.bin.Elemnt類。

Catalog.java:
package generated;
public interface Catalog
  extends javax.xml.bind.Element, generated.CatalogType
{
}


CatalogType.java是對應頂層復雜元素catalogType生成的接口。CatalogType接口對應catalog元素的每個屬性指定了setter和getter方法,還有對應catalog元素中的journal元素 的一個getter方法。

CatalogType.java:

package generated;
public interface CatalogType {
    java.lang.String getSection();
    void setSection(java.lang.String value);
    java.util.List getJournal();
    java.lang.String getPublisher();
    void setPublisher(java.lang.String value);
}

  
CatalogImpl.java 和CatalogTypeImpl.java是分別對應Catalog.java 和 CatalogType.java接口的實現類。

從Java類中創建一個XML文檔
這一節中,一個示例XMl文檔將會通進JAXB從Java類被創建。示例XML文檔,catalog.xml,如下顯示:
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="http://www.w3.org/2001/XMLSchema-Instance"
        section="Java Technology"
        publisher="IBM  developerWorks">
    <journal>          
       <article level="Intermediate"  date="January-2004" >
          <title>Service Oriented Architecture Frameworks </title>
           <author>Naveen Balani</author>
       </article>
      <article level="Advanced" date="October-2003"  >
          <title>Advance DAO Programming</title>
          <author>Sean Sullivan</author>
       </article>
       <article level="Advanced" date="May-2002"  >
          <title>Best Practices in EJB Exception Handling  </title>
          <author>Srikanth Shenoy    </author>
       </article>
   </journal>
</catalog>


從Java類中創建一個CatalogImpl類, 并且使用一個Marshaller(排列者)將CatalogImpl序列化來生成一個XML文檔。

創建Marshaller(排列者)
首先,導入javax.xml.bind包,其中包含了Marshaller, UnMarshaller, 和 JAXBContext類。Marshaller類用來將一個Java類轉換為XML數據。UnMarshaller類轉換一個XML文檔成Java對象。
import javax.xml.bind.*;


創建一個JAXBContext
一個JAXBContext對象被用來實現JAXB綁定框架的操作:marshal, unmarshal和validate。應用使用靜態方法newInstance(String contextPath)來創建一個新實例(對象)。contextPath指明一組由模式生成的接口的包名。
JAXBContext jaxbContext=JAXBContext.newInstance("generated");


目錄generated包含了JAXB生成的類和接口
使用createMarshaller方法創建一個Marshaller。Marshaller類重載了marshal方法,可以將Java對象序列化(也就是,轉換一個Java對象到XML數據)成SAX2事件,文檔對象模型(DOM),OutputStream, javax.xml.transform.Result或者java.io.Writer對象。

Marshaller marshaller=jaxbContext.createMarshaller();


為XML文檔創建一個Java對象:CatalogImpl
為了創建一個Java對象,首選生成一個ObjectFactory。ObjectFactory將會創建一個實現類的實例。對于每一個模式生成的Java類,ObjectFactory中定義了一個靜態方法來創建一個它的對象。
ObjectFactory factory=new ObjectFactory();


使用ObjectFactory類中的createCatalog來創建一個catalog元素。CatalogImpl是Catalog接口的實現類。
CatalogImpl catalog=(CatalogImpl)(factory.createCatalog());
使用CatalogImpl類中的setSection方法來設置catalog元素的section屬性。
catalog.setSection("Java Technology");

用setPublisher方法來設置catalog元素的publisher屬性。
catalog.setPublisher("IBM developerWorks");


為XML文檔創建一個Java對象:JournalImpl和ArticleImpl
用ObjectFactory類中的createJournal方法來創建一個jounal元素。JournalImpl是Journal接口的實現類。
JournalImpl journal=(JournalImpl)(factory.createJournal());

將journal元素加入catalog元素。從CatalogImpl得到JournalImpl的java.util.List,并把journal元素加入到List中。
java.util.List journalList=catalog.getJournal();
journalList.add(journal);


使用ObjectFactory類的createArticle方法來創建journal中的article元素。ArticleImpl是Article接口的實現類。
ArticleImpl article=(ArticleImpl)(factory.createArticle());


使用ArticleImpl類中的setLevel方法來設置article元素的level屬性。
article.setLevel("Intermediate");


用setDate方法設置article的date屬性
article.setDate("January-2004");


用setTitle方法創建article元素的title屬性
article.setTitle("Service Oriented Architecture Frameworks");


用setAuthor方法創建article元素的author屬性
article.setAuthor("Naveen Balani");


將article元素加入journal元素中。從JournalImpl中得到ArticleImpl的java.util.List,并將article元素加入List中。
java.util.List  articleList=journal.getArticle();
articleList.add(article);


與創建article元素的過程相類似,其它article元素也將被創建用來生成示例XML文檔catalog.xml
將Java對象序列化為一個XML文檔
用Marshaller類中的marshal方法來將CatalogImpl對象序列化為一個XML文檔。CatalogImpl對象被序列化為一個OutputStream
marshaller.marshal(catalog, new FileOutputStream(xmlDocument));


xmlDocument是輸出的XML的java.io.File對象,它代表的是本節一開始所展示的XML文檔。JAXBConstrUCtor.java,這個程序用來從Java類中生成一個XML文檔,也在這篇文章的示例代碼文件中。

總結
JAXB提供了一個綁定編譯器xjc, 從一個模式中生成Java對象,然后這些Java對象可以序列化為一個XML文檔。但是,JAXB有一個限制:它不支持所有的XML模式結構。

資源
·" Java XML 綁定架構"
·"XML 模式結構"
·Java Web 服務開發包 1.5
·這篇文章的示例代碼: jaxb-java-resources.zip:[下載文件]

Deepak Vohra 是一個NuBean的顧問和一個web開發者.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安溪县| 图木舒克市| 金阳县| 合水县| 大埔区| 通城县| 扬州市| 眉山市| 张家港市| 永年县| 阿克| 南皮县| 长岛县| 玛纳斯县| 南阳市| 贡觉县| 舞阳县| 昭通市| 息烽县| 福清市| 江口县| 克东县| 威信县| 隆林| 滦平县| 上饶县| 广德县| 永顺县| 博乐市| 丰镇市| 吉林省| 通城县| 安阳市| 荆州市| 仪陇县| 阆中市| 云安县| 柯坪县| 南平市| 遂昌县| 禹州市|