分享
 
 
 

程序设计:用JAXB生成一个XML文档

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

一个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...

generated\impl\runtime\ErrorHandlerAdaptor.java

generated\impl\runtime\MSVValidator.java

generated\impl\runtime\NamespaceContext2.java

generated\impl\runtime\UnmarshallableObject.java

generated\impl\runtime\MarshallerImpl.java

generated\impl\runtime\ValidationContext.java

generated\impl\runtime\UnmarshallerImpl.java

generated\impl\runtime\DefaultJAXBContextImpl.java

generated\impl\runtime\ContentHandlerAdaptor.java

generated\impl\runtime\GrammarInfoFacade.java

generated\impl\runtime\UnmarshallingContext.java

generated\impl\runtime\UnmarshallingEventHandlerAdaptor.java

generated\impl\runtime\XMLSerializable.java

generated\impl\runtime\Discarder.java

generated\impl\runtime\PrefixCallback.java

generated\impl\runtime\SAXMarshaller.java

generated\impl\runtime\NamespaceContextImpl.java

generated\impl\runtime\UnmarshallingEventHandler.java

generated\impl\runtime\GrammarInfo.java

generated\impl\runtime\InterningUnmarshallerHandler.java

generated\impl\runtime\ValidatableObject.java

generated\impl\runtime\GrammarInfoImpl.java

generated\impl\runtime\ValidatingUnmarshaller.java

generated\impl\runtime\ValidatorImpl.java

generated\impl\runtime\SAXUnmarshallerHandlerImpl.java

generated\impl\runtime\XMLSerializer.java

generated\impl\runtime\Util.java

generated\impl\runtime\SAXUnmarshallerHandler.java

generated\impl\runtime\AbstractUnmarshallingEventHandlerImpl.java

generated\impl\ArticleImpl.java

generated\impl\ArticleTypeImpl.java

generated\impl\CatalogImpl.java

generated\impl\CatalogTypeImpl.java

generated\impl\JAXBVersion.java

generated\impl\JournalImpl.java

generated\impl\JournalTypeImpl.java

generated\Article.java

generated\ArticleType.java

generated\Catalog.java

generated\CatalogType.java

generated\Journal.java

generated\JournalType.java

generated\ObjectFactory.java

generated\bgm.ser

generated\jaxb.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"

<titleService Oriented Architecture Frameworks </titl

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有