首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络安全-> 病毒防治
利用 JAXB 通过 XML 模式生成 XML 文档-.NET教程,XML应用
作者:网友供稿 点击:448
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
xml 模式是 xml 文档结构基于 xml 的表示。很多 j2ee 开发人员都使用 xml 模式来而非文档类型定义 (dtd) 来生成 xml 文档,这是因为,与 dtd 不同,xml 模式支持多种数据类型和命名空间。


人们经常会需要一个基于 xml 模式的 xml 文档。例如,您可能会发现自己需要一个基于企业 javabeans 部署描述符架构 (ejb-jar_2_1.xsd) 的 xml 文档。

包含在用于 java 的 oracle 10g xml 开发人员工具包 (xdk) 产品版(下载)中的 jaxb 类生成器是一个用于从 xml 模式生成 java 类的编译器。(可以使用 oracle jdeveloper 10g xml 模式编辑器构建 xml 模式。)jaxb 类生成器代替了 oracle9i xdk 中的模式类生成器,它生成表示 xml 模式中各种元素和 complextype 声明的 java 类。(用于 xml 绑定的 java 体系结构,即 jaxb,是一种用于将 xml 模式绑定到 java 代码表示的技术。)然后,j2ee 开发人员就可以使用 jaxb 类生成器生成的 java 类来构建符合 xml 模式的 xml 文档了。

在本技术说明中,我们将使用 jaxb 类生成器从一个示例 xml 模式生成 java 类。然后,我们将从这些 java 类创建一个示例 xml 文档。

预备设置 (windows)


要使用 jaxb 类生成器从 xml 模式生成 java 类,oracle 10g xdk jaxb 类生成器类以及命令行实用程序 orajaxb 必须加入类路径 (classpath) 中。将 xdk_nt_10_1_0_2_0_production.zip 文件解压缩到安装目录。将 <xdk>/lib/xml.jar、<xdk>/lib/xmlparserv2.jar 和 <xdk>/lib/xmlmesg.jar 添加到 classpath 变量。<xdk> 是 oracle 10g xdk 产品版所安装在的目录。

用于生成 java 类的 xml 模式


jaxb 类生成器会生成与顶级元素和顶级 complextype 元素相对应的 java 类。在 xml 模式中,元素使用 <xs:element> 表示,complextype 则使用 <xs:complextype> 表示。

下面是一个 xml 模式示例,oraclecatalog.xsd,该模式由一些顶级元素和顶级 complextype 元素组成:
<xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"
targetnamespace="http://jaxbderived/catalog"
xmlns:catalog="http://jaxbderived/catalog"
elementformdefault="qualified">

<xs:element name="oraclecatalog" type="catalog:catalog"/>

<xs:complextype name="catalog">
<xs:sequence>
<xs:element name="journal" type="catalog:journal" minoccurs="0" maxoccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="title" type="xs:string"/>
<xs:attribute name="publisher" type="xs:string"/>
</xs:complextype>

<xs:complextype name="journal">
<xs:sequence>
<xs:element name="article" type="catalog:article" minoccurs="0" maxoccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="date" type="xs:string"/>
</xs:complextype>
<xs:complextype name="article">
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="author" type="xs:string" minoccurs="0" maxoccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="section" type="xs:string"/>
</xs:complextype>
</xs:schema>

生成 java 类

在本节中,我们将讲述从 oraclecatalog.xsd 生成 java 类的过程。正如前面所提到的那样,java 类是使用 jaxb 类生成器命令行界面 orajaxb 生成的:
>java oracle.xml.jaxb.orajaxb -schema oraclecatalog.xsd -outputdir classes

以下是 orajaxb 的一些选项:
outputdir <dir> 指定在其中生成 java 类的目录。
schema <schemafile> 指定从中生成 java 类的 xml 模式。
targetpkg <targetpkg> 指定目标程序包名称。
在我们的示例中,将生成的 java 类为:article.java、articleimpl.java、oraclecatalog.java、oraclecatalogimpl.java、catalog.java、catalogimpl.java、journal.java、journaimpl.java 和 objectfactory.java。(根据生成这些类所用的 xdk 版本的不同,所生成的 java 类可能会有所不同,但是这些类的实现是相同的。)对应于该示例 xml 模式中的每个顶级元素和顶级 complextype 生成 java 接口和 java 类。还会生成 objectfactory.java 类,该类由用于创建接口对象的一些方法组成,如下所示:
package jaxbderived.catalog;

public class objectfactory
{
public jaxbderived.catalog.journal createjournal()
{
jaxbderived.catalog.journal elem = new jaxbderived.catalog.journalimpl(ownerdocument);
return elem;
}

public jaxbderived.catalog.article createarticle()
{
jaxbderived.catalog.article elem = new jaxbderived.catalog.articleimpl(ownerdocument);
return elem;
}

public jaxbderived.catalog.catalog createcatalog()
{
jaxbderived.catalog.catalog elem = new jaxbderived.catalog.catalogimpl(ownerdocument);
return elem;
}

public jaxbderived.catalog.oraclecatalog createoraclecatalog()
{
jaxbderived.catalog.oraclecatalog elem = new jaxbderived.catalog.oraclecatalogimpl(ownerdocument);
return elem;
}

public object newinstance (class javacontentinterface) throws javax.xml.bind.jaxbexception
{
object newinstance = null;
string elemname = javacontentinterface.getname();
try
{
if (elemname.equals("jaxbderived.catalog.oraclecatalog"))
{
newinstance = new jaxbderived.catalog.oraclecatalogimpl(ownerdocument);
return newinstance;
}
}
catch (exception e)
{
throw new javax.xml.bind.jaxbexception(e.tostring());
}
return null;
}

public object getproperty(string name)
{
return null;
}

public void setproperty(string name, object value)
{
}

public object unmarshal(org.w3c.dom.node node) throws javax.xml.bind.unmarshalexception
{
string elemname = node.getlocalname();
try
{
if (elemname.equals("oraclecatalog"))
{
jaxbderived.catalog.oraclecatalog unode =
new jaxbderived.catalog.oraclecatalogimpl((oracle.xml.parser.v2.xmlelement)node);
return unode;
}
}
catch (exception e)
{
throw new javax.xml.bind.unmarshalexception(e.tostring());
}
return null;
}

private oracle.xml.parser.v2.xmldocument ownerdocument =
new oracle.xml.parser.v2.xmldocument();

}


oraclecatalog.java 是使用 jaxb 类生成器生成的、对应于 xml 模式中顶级元素的 java 类之一,它是对应于 oraclecatalog.xsd 模式中顶级元素 oraclecatalog 而生成的 java 接口。
package jaxbderived.catalog;

public interface oraclecatalog extends jaxbderived.catalog.catalog, javax.xml.bind.element
{
}

oraclecatalogimpl.java 是对应于 oraclecatalog.xsd 模式顶级元素 oraclecatalog 而生成的 java 类:
package jaxbderived.catalog;

public class oraclecatalogimpl extends jaxbderived.catalog.catalogimpl implements jaxbderived.catalog.oraclecatalog
{
public oraclecatalogimpl(oracle.xml.parser.v2.xmldocument ownerdoc)
{
super("oraclecatalog", "http://jaxbderived/catalog", ownerdoc);
}

public oraclecatalogimpl(string name, string namespace, oracle.xml.parser.v2.xmldocument ownerdoc)
{
super(name, namespace, ownerdoc);
}

public oraclecatalogimpl(oracle.xml.parser.v2.xmlelement node)
{
super(node);
}

}

catalog.java 是对应于 xml 模式中顶级 complextype 声明生成的 java 类之一,它是对应于 oraclecatalog.xsd 模式顶级 complextype catalog 而生成的 java 接口。
package jaxbderived.catalog;

public interface catalog
{
public void settitle(java.lang.string t);

public java.lang.string gettitle();

public void setpublisher(java.lang.string p);

public java.lang.string getpublisher();

public java.util.list getjournal();

}

catalogimpl.java 是对应于顶级模式 complextype catalog 而生成的 java 类:
package jaxbderived.catalog;

public class catalogimpl extends oracle.xml.jaxb.jaxbnode implements jaxbderived.catalog.catalog
{
public catalogimpl(oracle.xml.parser.v2.xmldocument ownerdoc)
{
super("catalog", "http://jaxbderived/catalog", ownerdoc);
}

public catalogimpl(string name, string namespace, oracle.xml.parser.v2.xmldocument ownerdoc)
{
super(name, namespace, ownerdoc);
}

public catalogimpl(oracle.xml.parser.v2.xmlelement node)
{
super(node);
}

public void settitle(java.lang.string t)
{
super.setjaxbattrstringvalue("title", "", t);
}

public java.lang.string gettitle()
{
return super.getjaxbattrstringvalue("title", "");
}

public void setpublisher(java.lang.string p)
{
super.setjaxbattrstringvalue("publisher", "", p);
}

public java.lang.string getpublisher()
{
return super.getjaxbattrstringvalue("publisher", "");
}

public java.util.list getjournal()
{
return (java.util.list)super.getlist("journal", "http://jaxbderived/catalog", this, 0);
}

public object createjaxbnode(oracle.xml.parser.v2.xmlnode node)
{
string name = node.getlocalname();
string namespace = node.getnamespaceuri();
if (namespace == null)
namespace = "";

if (name.equals("journal") && namespace.equals("http://jaxbderived/catalog"))
{
jaxbderived.catalog.journalimpl obj = new jaxbderived.catalog.journalimpl(getownerdocument());
obj.populatenodearray(node);
return obj;
}

return null;
}

public void populatenodearray(oracle.xml.parser.v2.xmlnode node)
{
string name, namespace;
oracle.xml.parser.v2.xmlnode n = (oracle.xml.parser.v2.xmlnode)node.getfirstchild();

while (n != null)
{
name = n.getlocalname();
namespace = n.getnamespaceuri();

if (namespace == null)
namespace = "";

if (name.equals("journal") && namespace.equals("http://jaxbderived/catalog"))
{
super.setnodevectorvalue(0, n);
}

n = (oracle.xml.parser.v2.xmlnode)n.getnextsibling();
}

super.populatenodearray(node);
}

static final object[] _journal =
{};

static final object[] _catalog =
{_journal };

protected object[] getschemaobject()
{
return _catalog;
}

}


现在,我们来继续介绍从这些 java 类生成 xml 文档的过程。

创建 xml 文档

在本节中,我们将从使用 jaxb 类生成器生成的上面这些 java 类创建一个 xml 文档示例,oraclecatalog.xml。

从这些 java 类创建 catalogimpl,并对 catalogimpl 类对象进行编组,以构建一个 xml 文档。首先,导入 javax.xml.bind 程序包。
import javax.xml.bind.*;

现在导入这些 oracle jaxb 类。
import oracle.xml.jaxb.*;

创建一个编组器将 catalog 对象编组到 xml 文档中。
jaxbcontextimpl jaxbcontext=new jaxbcontextimpl();
marshaller marshaller=jaxbcontext.createmarshaller();

现在,创建 objectfactory,我们将从中创建一个实现类的新实例。objectfactory 是 jaxb 的一个重要特性,因为它提供代码可移植性。
objectfactory factory=new objectfactory();

创建 catalog 元素:
catalogimpl catalog=(catalogimpl)(factory.createcatalog());

设置 catalog 元素的 title 属性:
catalog.settitle("oracle magazine");

设置 catalog 元素的 publisher 属性。
catalog.setpublisher("oracle publishing");

创建 journal 元素。
journalimpl journal=(journalimpl)(factory.createjournal());

设置 journal 元素的 date 属性。
journal.setdate("november-december 2003");

将 journal 元素添加到 catalog 元素。
java.util.list journallist=catalog.getjournal();
journallist.add(journal);

在 journal 元素中创建 article 元素。
articleimpl article=(articleimpl)(factory.createarticle());

设置 article 元素的 section 属性。
article.setsection("xml");

在 article 元素中创建 title 元素。
article.settitle("updating xquery");

向 journal 元素添加 article 元素。
java.util.list articlelist=journal.getarticle();
articlelist.add(article);

在 article 元素中创建 author 元素。
java.util.list authorlist=article.getauthor();
authorlist.add("jason hunter");

与使用上面说明的步骤创建的 journal 元素相似,添加另外一个 journal 元素,以创建示例 xml 文档 oraclecatalog.xml。然后将 catalogimpl 对象编组到一个 xml 文档。
marshaller.marshal(catalog, new fileoutputstream(xmldocument));

这就生成了 oraclecatalog.xml:
<?xml version="1.0" encoding = utf-8?>
<catalog title="oracle magazine" publisher="oracle publishing" xmlns="http://jaxbderived/catalog">
<journal date="november-december 2003">
<article section="xml">
<title>updating xquery</title>
<author>jason hunter</author>
</article>
</journal>

<journal date="september-october 2003">
<article section="sql">
<title>the active database</title>
<author> cameron orourke</author>
</article>
</journal>
</catalog>

下面所示为 xmlconstructor.java,它是用于从这些 java 类创建 xml 文档的程序:
import jaxbderived.catalog.*;
import oracle.xml.jaxb.*;
import oracle.xml.parser.v2.*;
import java.io.file;
import java.io.fileoutputstream;
import java.io.ioexception;
import javax.xml.bind.*;

public class xmlconstructor
{
public void generatexmldocument(file xmldocument){
try
{

jaxbcontextimpl jaxbcontext=new jaxbcontextimpl();
marshaller marshaller=jaxbcontext.createmarshaller();


objectfactory factory=new objectfactory();
catalogimpl catalog=(catalogimpl)(factory.createcatalog());
catalog.settitle("oracle magazine");
catalog.setpublisher("oracle publishing");


journalimpl journal=(journalimpl)(factory.createjournal());
journal.setdate("november-december 2003");



articleimpl article=(articleimpl)(factory.createarticle());

article.setsection("xml");
article.settitle("updating xquery");



java.util.list journallist=catalog.getjournal();

journallist.add(journal);

java.util.list articlelist=journal.getarticle();

articlelist.add(article);

java.util.list authorlist=article.getauthor();
authorlist.add("jason hunter");


journal=(journalimpl)(factory.createjournal());
journal.setdate("september-october 2003");


article=(articleimpl)(factory.createarticle());

article.setsection("sql");
article.settitle("the active database");


journallist=catalog.getjournal();

journallist.add(journal);

articlelist=journal.getarticle();

articlelist.add(article);

authorlist=article.getauthor();
authorlist.add("cameron orourke");

marshaller.marshal(catalog, new fileoutputstream(xmldocument));

}catch (ioexception e)
{
system.out.println(e.tostring());

}
catch (jaxbexception e)
{
system.out.println(e.tostring());

}

}
public static void main (string[] argv)
{ string xmldocument=argv[0];
xmlconstructor xmlconstructor=new xmlconstructor();
xmlconstructor.generatexmldocument(new file(xmldocument));
}
}


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·常用ASCII 码对照表-ASP教程,ASP基础
·使用jsp实现word、excel格式报表打印-JSP教程,Jsp/Servlet
·vb.net中的数据库连接-.NET教程,数据库应用
·细说Java之util类-JSP教程,Java技巧及代码
·揪出系统中秘密隐藏的木马
·利用 JAXB 通过 XML 模式生成 XML 文档-.NET教程,XML应用
·asp.net2.0 站点登录,导航与权限管理-.NET教程,.NET Framework
·一个将阿拉伯数字转换成中文大写的最简单算法-.NET教程,数据库应用
·65w双路输出1/4砖型模块电源的介绍
·拥有xp风格的界面-.NET教程,Windows开发
最新文章
·制作一个百毒不侵的系统_病毒防治教程
·教你认识网页中五种隐形的危险病毒_病毒防治教程
·用excel剿灭dll木马_病毒防治教程
·15实用免费安全软件大搜罗_病毒防治教程
·如何让u盘做到100%预防病毒_病毒防治教程
·利用windows系统自带命令手工搞定病毒_病毒防治教程
·windows vista系统下的rootkit攻防_病毒防治教程
·六招关闭windows xp自动播放防止病毒_病毒防治教程
·巧设江民2007 彻底防范msn相册病毒_病毒防治教程
·加壳与脱壳 杀毒软件新技术的意义_病毒防治教程
相关主题
  • 利用 Java Web Start发布你用java程序-JSP教程,Java技巧及代码
  • 利用 Java 平台的特性建造一个令人瞩目的系统-JSP教程,Java基础
  • 利用 Java 撰寫PDA應用程式【链接】-JSP教程,资料/其它
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭