科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道用JAXB生成一个XML文档2

用JAXB生成一个XML文档2

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

一个XML 模式(Schema)用XML语法表达了一个XML文档的结构。J2EE的开发者也许会需要一个符合XML模式的XML文档。在这篇教程中,作者使用了JAXB用来从一个XML模式中生成Java类。这些Java类将会生成一个范例XML文档

来源:IT专家网 2008年5月31日

关键字: 文档 XML 生成 java

  • 评论
  • 分享微博
  • 分享邮件
对于示例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模式结构。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章