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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

從XML到Java代碼的數(shù)據(jù)綁定之二

2019-11-18 11:02:54
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文轉(zhuǎn)自 IBM developerWorks 中國(guó)網(wǎng)站

xml 數(shù)據(jù)創(chuàng)建類(lèi)


  數(shù)據(jù)綁定系列的第二篇是如何從 XML 數(shù)據(jù)限制中生成一個(gè) java 語(yǔ)言。本文通過(guò)完整的代碼展現(xiàn)了如何生成類(lèi)和代碼,并提供了如何定制您自己版本的建議。還沒(méi)有看過(guò)第一篇嗎?第一篇,"對(duì)象,無(wú)處不在的對(duì)象", 解釋了數(shù)據(jù)綁定是如何將 XML 和 Java 語(yǔ)言對(duì)象互為轉(zhuǎn)換。它比較了數(shù)據(jù)綁定和其它在 Java 程序中處理 XML 的方法, 并介紹了一個(gè) XML 配置文檔示例。第一部分也介紹了使用 XML Schema 來(lái)約束數(shù)據(jù)。

  在深入 Java 程序和 XML 代碼之前,先快速回顧一下本系列第一部分所打下的基礎(chǔ)。

  在第一部分中,我們知道只要可以標(biāo)識(shí)文檔的一組約束,就可以將文檔轉(zhuǎn)換成 Java 對(duì)象。那些約束為數(shù)據(jù)提供了接口。如 Web 服務(wù)配置文檔示例中所示,XML 文檔應(yīng)當(dāng)成為現(xiàn)有 Java 類(lèi)的一個(gè)實(shí)例,并且從數(shù)據(jù)約束生成那個(gè)類(lèi)。最后,會(huì)看到表示樣本 XML 文檔約束的 XML schema。

  假如對(duì)細(xì)節(jié)還有疑問(wèn),請(qǐng)回顧第一篇文章.

  打造基礎(chǔ)

  現(xiàn)在,可以著手從 XML schema 創(chuàng)建 Java 類(lèi)。該類(lèi)必須準(zhǔn)確表示數(shù)據(jù)約束,并提供 Java 應(yīng)用程序?qū)⑹褂玫暮?jiǎn)單讀方法和寫(xiě)方法。開(kāi)始之前,讓我們先回顧清單 1,查看為 WebServiceConfiguration 文檔定義的 XML schema。

  清單 1. 表示 Web 容器配置文檔數(shù)據(jù)接口的 XML schema

<?xml version="1.0"?>

<schema targetNamespace="http://www.enhydra.org"
      xmlns="http://www.w3.org/1999/xmlSchema"
      xmlns:enhydra="http://www.enhydra.org"


 ?。糲omplexType name="ServiceConfiguration">
  ?。糰ttribute name="name" type="string" />
   <attribute name="version" type="float" />
 ?。?complexType>

 ?。糴lement name="serviceConfiguration" type="ServiceConfiguration" />

  <complexType name="WebServiceConfiguration"
           baseType="ServiceConfiguration"
           derivedBy="extension">
  ?。糴lement name="port">
   ?。糲omplexType>
    ?。糰ttribute name="    ?。糰ttribute name="number" type="integer" />
     <attribute name="protected" type="string" />
   ?。?complexType>
  ?。?element>

   <element name="document">
   ?。糲omplexType>
    ?。糰ttribute name="root" type="string" />
    ?。糰ttribute name="index" type="string" />
    ?。糰ttribute name="error" type="string" />
   ?。?complexType>
   </element>
 ?。?complexType>

<element name="webServiceConfiguration" type="WebServiceConfiguration" />

</schema>

  生成代碼

  開(kāi)始生成 Java 代碼之前,首先必須確定核心類(lèi)的名稱(chēng)。將使用 org.enhydra.xml.binding 包中的 SchemaMapper,它是 Enhydra 應(yīng)用服務(wù)器實(shí)用程序類(lèi)集合的一部分。還可以將任何必需的支持類(lèi)放到這個(gè)包中。

  除了類(lèi)名稱(chēng)以外,還必須確定用來(lái)讀取和創(chuàng)建 XML 的 Java API。如上一篇文章中所討論過(guò)的,三種主要選擇是 SAX、DOM 和 JDOM。由于 SAX 僅僅適用于讀取 XML 文檔,因此它不適合創(chuàng)建 XML。由于在打包階段中要將 Java 對(duì)象轉(zhuǎn)換為 XML 表示,因此在此階段中需要?jiǎng)?chuàng)建 XML。這就將選擇的范圍縮小到 DOM 和 JDOM。在這兩種選擇都可用的情況下,本例中我選擇使用 JDOM API,僅為了顯示其功能性(并不僅僅因?yàn)槲沂撬暮现咧唬。?br />
  最后,必須指出如何將 XML schema 提供給 SchemaMapper 類(lèi)。通常,可以假設(shè)類(lèi)的生成是脫機(jī)完成的(通過(guò)靜態(tài) main 方法)。僅通過(guò)使 main 方法調(diào)用非靜態(tài)方法,還可以從運(yùn)行時(shí)環(huán)境中使用類(lèi)。做了這些決定后,就可以開(kāi)始勾畫(huà)類(lèi)的框架了。
  組裝 SchemaMapper 類(lèi)框架

  要做的第一件事就是為要生成的代碼設(shè)置一些基本存儲(chǔ)器。必須能夠從每個(gè)執(zhí)行映射的 XML schema 生成多個(gè)接口和實(shí)現(xiàn)。Java HashMap 正好滿(mǎn)足要求。鍵是接口或?qū)崿F(xiàn)名稱(chēng)以及映射表中的值,該值是將要輸出到新 Java 程序文件的實(shí)際代碼。還需要存儲(chǔ)每對(duì)接口/實(shí)現(xiàn)的屬性(屬性是在這兩種類(lèi)之間共享的)。這里,我再次使用 HashMap。其中,鍵是接口名稱(chēng)。但是,由于每個(gè)接口可能有多個(gè)屬性,因此該值是另一個(gè)具有屬性及其類(lèi)型的 HashMap。最后,必須存儲(chǔ) XML schema 的名稱(chēng)空間,因?yàn)?JDOM 將使用這個(gè)名稱(chēng)空間來(lái)訪問(wèn) XML schema 中的結(jié)構(gòu)。所有這些具體信息都足以初步勾畫(huà)出新類(lèi)的框架,新類(lèi)在清單 2 中。

  還請(qǐng)注重在清單 2 中已添加了兩個(gè)需要使用的基本方法:其中一個(gè)方法需要使用 XML schema 的 URL 來(lái)執(zhí)行生成(答應(yīng)它在網(wǎng)絡(luò)可訪問(wèn) schema 以及本地 schema 下運(yùn)行),另一個(gè)方法將類(lèi)輸出到指定的目錄中。最后,簡(jiǎn)單的 main 方法將 XML schema 看作一個(gè)變量,然后執(zhí)行生成。

  清單 2. SchemaMapper 類(lèi)的框架 package org.enhydra.xml.binding;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.List;

// JDOM classes used for document representation
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.NoSUChAttributeException;
import org.jdom.NoSuchChildException;
import org.jdom.input.SAXBuilder;

/**
* <p>

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 凤翔县| 长岭县| 茌平县| 南康市| 西宁市| 玉门市| 富顺县| 阳西县| 新竹市| 桓台县| 岳阳县| 信丰县| 商水县| 潮安县| 浦城县| 大悟县| 泰安市| 曲沃县| 海淀区| 堆龙德庆县| 汉源县| 滁州市| 澜沧| 池州市| 黑龙江省| 靖远县| 镇平县| 巴楚县| 阿拉善盟| 南宁市| 阳朔县| 合江县| 韶山市| 冕宁县| 高陵县| 塔河县| 大渡口区| 祁阳县| 汪清县| 双牌县| 同仁县|