时间:2005-03-10 作者:Hetal Shah 浏览次数: 4533 本文关键字:配置,XMLBeans |
|
<?xml version="1.0" encoding="UTF-8"?> <xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config"> ... </xb:config>正如您所看到的,根config元素必须位于http://xml.apache.org/xmlbeans/2004/02/xbean/config名称空间中。真正的配置功能必须位于config元素之内,可按任何次序排放。
scomp -out output_XmlBeans.jar someSchema.xsd someConfig.xsdconfig注意配置文件只是简单添加到scomp的附加参数。这将确保生成器使用您所指定的任何扩展功能。以下部分对这些功能依次进行了检查。
该localInfo.xsd 模式导入 weather.xsd,如清单2所示。< xsd:schema
targetNamespace ="http://www.localInfo.com/LI"
...
xmlns:ns1 ="http://www.helloWeather.com/weather"
>
< xsd:import
namespace ="http://www.helloWeather.com/weather"
schemaLocation ="weather.xsd" />
< xsd:element name ="localInfo" >
< xsd:complexType >
< xsd:sequence >
< xsd:element ref ="ns1:localWeather" />
</ xsd:sequence >
< xsd:attribute ref ="Zipcode" />
</ xsd:complexType >
</ xsd:element >
< xsd:attribute name ="Zipcode" type ="xsd:string" />
</ xsd:schema >
最后,清单3显示了一个简单完整的配置文件(localInfo.xsdconfig),它说明了XMLBeans前缀、后缀功能的用法。< xsd:schema targetNamespace =
"http://www.helloWeather.com/weather"
....
>
< xsd:element name ="localWeather" >
< xsd:complexType >
< xsd:sequence >
< xsd:element ref ="Temperature" />
< xsd:element ref ="Humidity" />
< xsd:element ref ="Visibility" />
< xsd:element ref ="Datetime" />
< xsd:element ref ="image"
minOccurs ="1" maxOccurs ="1" />
</ xsd:sequence >
< xsd:attribute ref ="Zipcode" />
</ xsd:complexType >
</ xsd:element >
< xsd:element name ="Temperature"
type ="xsd:float" />
< xsd:element name ="Humidity"
type ="xsd:float" />
< xsd:element name ="Visibility"
type ="xsd:float" />
< xsd:element name ="Datetime"
type ="xsd:dateTime" />
< xsd:element name ="image"
type ="imageType" />
< xsd:attribute name ="Zipcode"
type ="xsd:string" />
< xsd:complexType name ="imageType" >
< xsd:simpleContent >
< xsd:extension base ="xsd:base64Binary" >
< xsd:attribute name ="type" use ="optional"
type ="xsd:string" />
</ xsd:extension >
</ xsd:simpleContent >
</ xsd:complexType >
prefix和suffix元素分别指定了从名称空间中为模式类型创建的XMLBeans类名的前缀和后缀,其中名称空间由namespace元素中的uri属性值定义。在以上localInfo.xsdconfig列表中,我们希望不论模式类型代表什么名称空间,都为所有从XML模式创建的XMLBeans类名添加前缀“XmlBean”。为此示例,我们不使用前缀功能。< xb:config xmlns:xb =
"http://xml.apache.org/xmlbeans/2004/02/xbean/config"
>
< xb:namespace uri ="##any" >
< xb:suffix > XmlBean </ xb:suffix >
< xb:prefix > pre </ xb:prefix >
</ xb:namespace >
</ xb:config >
使用配置文件的结果是,生成的XMLBean类将具有适当的后缀。例如,为Zipcode属性生成的XMLBean将被称作ZipcodeAttributeXmlBean.java,而不是原来默认情况下的ZipcodeAttribute。scomp-outlocalinfo_XmlBeans . jarlocalInfo . xsdlocalInfo . xsdconfig
记得要为使用的名称空间声明前缀来使元素成为配置文件中的一部分。这里我们已经为config元素中的http://www.helloWeather.com/weather名称空间声明了前缀NS1。< xb:config
xmlns:xb =
"http://xml.apache.org/xmlbeans/2004/02/xbean/config"
xmlns:NS1 ="http://www.helloWeather.com/weather" >
...
< xb:namespace uri ="http://www.localInfo.com/LI" >
< xb:package > com.localInfo </ xb:package >
</ xb:namespace >
< xb:namespace uri ="http://www.helloWeather.com/weather" >
< xb:package > com.weather </ xb:package >
</ xb:namespace >
< xb:qname name ="NS1:image" javaname ="MapXmlBean" />
...
</ xb:config >
这样使用的结果是,为模式类型生成的、属于http://www.localInfo.com/LI名称空间的XMLBean类的包名称是com.localInfo,而不是原来默认情况下的com.localInfo.li。< xb:namespace uri ="http://www.localInfo.com/LI" >
< xb:package > com.localInfo </ xb:package >
</ xb:namespace >
for属性能够接收按空间划分的XMLBeans Java接口列表,或者使用“*”来包含扩展中的所有接口。这种做法的结果是,生成的XMLBeans接口LocalWeatherDocumentXmlBean$LocalWeather将扩展指定的接口,在本例中将扩展为com.extension.weatherExtension。该例中,我们为接口声明了两种方法:< xb:extension for =
"com.weather.LocalWeatherDocumentXmlBean$LocalWeather"
>
< xb:interface
name ="com.extension.weatherExtension" >
< xb:staticHandler >
com.extension.weatherExtensionHandler
</ xb:staticHandler >
</ xb:interface >
</ xb:extension >
对于com.extension.weatherExtension接口的实现方法将自动在相应的XMLBeans实现类LocalWeatherDocumentXmlBeanImpl$LocalWeatherImpl中生成。这些实现方法将委托给特定的扩展处理程序的com.extension.weatherExtensionHandler方法。public interface weatherExtension {
floatgetTemperatureInCelsius();
floatgetVisibilityInKilometers();
}
每次LocalWeatherDocumentXmlBean$LocalWeather实例的扩展方法被调用时,都将调用以上两个方法。public static float getTemperatureInCelsius
(XmlObjectxo) {
.....
}
public static float getVisibilityInKilometers
(XmlObjectxo) {
.....
}
scomp-outlocalinfo_XmlBeans . jarlocalInfo . xsdlocalInfo . xsdconfig
scomp-outlocalinfo_XmlBeans . jarlocalInfo . xsdlocalInfo . xsdconfig
哇!我们已经准备好了编译并运行包含在示例存档中的基于XMLBeans的客户端应用程序extensionClient.java。
通过使用接口扩展功能,我们已经将附加逻辑从客户端应用程序移至XMLBean Java代码上。现在的代码已集中化并可重用。同时,XMLBean的客户端应用程序变得更简洁精练。javacextensionClient . java
javaextensionClientlocalInfo_68154 . xml
extension元素的for属性指定了按空间划分的XMLBeans的列表,其中setter方法按照下面LocalWeatherDocumentXmlBean$LocalWeather类所展示的那样调用preSet()方法和postSet()方法:< xb:extension for ="
com.weather.LocalWeatherDocumentXmlBean$LocalWeather
" >
< xb:prePostSet >
< xb:staticHandler >
com.extension.MapPrePostSetHandler
</ xb:staticHandler >
</ xb:prePostSet >
</ xb:extension >
以上代码是使用PrePost扩展将生成什么结果的一个示例。注意在set方法和append方法中都调用了pre和post方法。/**
*Setsthe"image"element
*/
public void setMapXmlBean
(com.weather.ImageTypeXmlBeanmapXmlBean)
{
synchronized(monitor())
{
check_orphaned();
if(com.extension.MapPrePostSetHandler.preSet
(1,this,MAPXMLBEAN$8,false,-1)
)
{
....CodetosetImageTypeXmlBeaninstance
}
com.extension.MapPrePostSetHandler.postSet
(1,this,MAPXMLBEAN$8,false,-1);
}
}
/**
*Appendsandreturnsanewempty"image"element
*/
public com.weather.ImageTypeXmlBean
addNewMapXmlBean()
{
synchronized(monitor())
{
check_orphaned();
com.weather.ImageTypeXmlBeantarget=null;
if(com.extension.MapPrePostSetHandler.preSet
(2,this,MAPXMLBEAN$8,false,-1)
)
{
...
Codetocreateandreturnanemptyinstance
ofImageTypeXmlBean
...
}
com.extension.MapPrePostSetHandler.postSet
(2,this,MAPXMLBEAN$8,false,-1);
returntarget;
}
}
public static boolean preSet( int operationType,
XmlObjectxo,QNamepropertyName,
boolean isAttr, int indexOfItem) {
javax.xml.namespace.QNameimageQName=
newjavax.xml.namespace.QName
("http://www.helloWeather.com/weather","image");
if((xoinstanceofLocalWeather)
&&(propertyName.equals(imageQName)))
st发表评论
评论