Java: 玩转schema+xmlbeans

博客介绍了schema,它用于定义xml,能定义简单和复杂数据结构,具有语言无关等特点。还提及在多个产品中有其身影,介绍了手写schema的困难,以及xmlbeans这一根据schema生成Java Bean的工具,并展示了生成类和验证结果等内容。

最近在公司问了一下,知道schema的人很少,能够运用的更是凤毛麟角.

schema是用来定义xml的,就象定义数据库中库中要定义表结构,没有schma的xml是一盘散沙.

在很多产品中,都能看到schema的身影,比如.net中的dataset,Office中的infopath,WebService中的wsdl...

schema的一些特点:
    定义简单和复杂的数据结构
    用NameSpace来区别,相互引用
    语言无关
    可以加入描述等附加信息...

先看看schema的简单功能:

简单类型,基于String, 长度介于2~5位
None.gif      < xs:simpleType  name ="chineseName" >
None.gif        
< xs:restriction  base ="xs:string" >
None.gif            
< xs:maxLength  value ="5" />
None.gif            
< xs:minLength  value ="2" />
None.gif        
</ xs:restriction >
None.gif    
</ xs:simpleType >
简单类型,基于String,用正则表达式限定格式:
None.gif      < xs:simpleType  name ="arenumber" >
None.gif        
< xs:restriction  base ="xs:string" >
None.gif            
< xs:pattern  value ="0[1-9][0-9]{1,2}" />
None.gif        
</ xs:restriction >
None.gif    
</ xs:simpleType >
简单类型,基于String,枚举:
None.gif      < xs:simpleType  name ="gender" >
None.gif        
< xs:restriction  base ="xs:string" >
None.gif            
< xs:enumeration  value ="男" />
None.gif            
< xs:enumeration  value ="女" />
None.gif        
</ xs:restriction >
None.gif    
</ xs:simpleType >
None.gif
posted @ 2004-10-14 21:37 steeven 阅读(115) | 评论 (0)编辑  收藏


手写xml是个很痛苦的事情,手写schema更痛苦.即使用xmlspy,还是有些东西写不出来,比如复杂的数据限制.

xmlbeans是bea捐赠给apache的根据schema生成Java Bean的工具.上面的schema通过编译:
    scomp -src src test.xsd
生成如下类:(注意package是xsd的targetNamespace,可以通过配置文件调整)
xmlbean1.JPG
其中Gender的枚举类型被自动生成嵌套枚举类,是不是很方便呢?teeth_smile.gif

None.gif public   interface  Gender extends org.apache.xmlbeans.XmlString
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
static final Enum 男 = Enum.forString("");
InBlock.gif    
static final Enum 女 = Enum.forString("");
ExpandedBlockEnd.gif}

测试一下:

None.gif         Arenumber area  =  Arenumber.Factory.newInstance();
None.gif        area.setStringValue(
" 0467 " );
None.gif        System.
out .println(area);
None.gif        System.
out .println( " 验证结果: " + area.validate());
None.gif        Gender gender 
=  Gender.Factory.newInstance();
None.gif        gender.setStringValue(Gender.女.toString());
None.gif        System.
out .println(gender);
None.gif        System.
out .println( " 验证结果: " + gender.validate());
None.gif        ChineseName cn 
=  ChineseName.Factory.newInstance();
None.gif        cn.setStringValue(
" " );
None.gif        System.
out .println(cn);
None.gif        System.
out .println( " 验证结果: " + cn.validate());

运行结果:
<xml-fragment>
0467
</xml-fragment>
验证结果:true
<xml-fragment>

</xml-fragment>
验证结果:true
<xml-fragment>

</xml-fragment>
验证结果:false

注意:
    ChineseName的验证结果为false,因为长度不符合.
    因为schemaType只描述数据,<xml-fragment>只是匿名容器
除了上面的newInstance()和validate()方法,还有一些其它实用方法:

None.gif         Gender.Factory.newValue(Object); // 生成新实例
None.gif
        Gender.Factory.parse(File);
None.gif        Gender.Factory.parse(Reader);
None.gif        Gender.Factory.parse(InputStream);
None.gif        Gender.Factory.parse(Node);
None.gif        Gender.Factory.parse(URL);
None.gif        Gender.Factory.parse(String);        
None.gif        cn.newDomNode(); 
// 生成DOM
None.gif
        cn.newInputStream();  // 生成InputStream
None.gif
        cn.newReader();  // 生成Reader
None.gif
        cn.xmlText();  // 生成xml文本
None.gif
        cn.schemaType();  // 拿到编译后的Schema.用途稍后再说
None.gif
        cn.save(File); 
None.gif        cn.save(Writer);
None.gif        cn.save(OutputStream);
None.gif        cn.selectPath(
" some/path[here='where'] " );  // xpath
None.gif



 

posted @ 2004-10-14 22:31 steeven 阅读(121) | 评论 (2)编辑  收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值