时间:2005-03-10 作者:Hetal Shah 浏览次数: <script src="http://203.81.25.103/cgi-bin/beadevcount.cgi?d_id=371" type="text/JavaScript" language="JavaScript"></script> 3102 本文关键字:配置, XMLBeans |
|
<?xml version="1.0" encoding="UTF-8"?>正如您所看到的,根config元素必须位于http://xml.apache.org/xmlbeans/2004/02/xbean/config名称空间中。真正的配置功能必须位于config元素之内,可按任何次序排放。
<xb:config
xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">
...
</xb:config>
scomp -out output_XmlBeans.jar someSchema.xsd someConfig.xsdconfig注意配置文件只是简单添加到scomp的附加参数。这将确保生成器使用您所指定的任何扩展功能。以下部分对这些功能依次进行了检查。
<xsd:schema该localInfo.xsd 模式导入 weather.xsd,如清单2所示。
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>
<xsd:schema targetNamespace=最后,清单3显示了一个简单完整的配置文件(localInfo.xsdconfig),它说明了XMLBeans前缀、后缀功能的用法。
"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>
<xb:config xmlns:xb=prefix和suffix元素分别指定了从名称空间中为模式类型创建的XMLBeans类名的前缀和后缀,其中名称空间由namespace元素中 的uri属性值定义。在以上localInfo.xsdconfig列表中,我们希望不论模式类型代表什么名称空间,都为所有从XML模式创建的 XMLBeans类名添加前缀“XmlBean”。为此示例,我们不使用前缀功能。
"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>
scomp -out localinfo_XmlBeans.jar localInfo.xsd localInfo.xsdconfig使用配置文件的结果是,生成的XMLBean类将具有适当的后缀。例如,为Zipcode属性生成的XMLBean将被称作ZipcodeAttributeXmlBean.java,而不是原来默认情况下的ZipcodeAttribute。
<xb:config记得要为使用的名称空间声明前缀来使元素成为配置文件中的一部分。这里我们已经为config元素中的http://www.helloWeather.com/weather名称空间声明了前缀NS1。
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>
<xb:namespace uri="http://www.localInfo.com/LI">这样使用的结果是,为模式类型生成的、属于http://www.localInfo.com/LI名称空间的XMLBean类的包名称是com.localInfo,而不是原来默认情况下的com.localInfo.li。
<xb:package>com.localInfo</xb:package>
</xb:namespace>
<xb:extension for=for属性能够接收按空间划分的XMLBeans Java接口列表,或者使用“*”来包含扩展中的所有接口。这种做法的结果是,生成的XMLBeans接口 LocalWeatherDocumentXmlBean将扩展指定的接口,在本例中将扩展为 com.extension.weatherExtension。该例中,我们为接口声明了两种方法:
"com.weather.LocalWeatherDocumentXmlBean"
>
<xb:interface
name="com.extension.weatherExtension">
<xb:staticHandler>
com.extension.weatherExtensionHandler
</xb:staticHandler>
</xb:interface>
</xb:extension>
public interface weatherExtension {对于com.extension.weatherExtension接口的实现方法将自动在相应的XMLBeans实现类 LocalWeatherDocumentXmlBeanImpl中生成。这些实现方法将委托给特定的扩展处理程序的 com.extension.weatherExtensionHandler方法。
float getTemperatureInCelsius();
float getVisibilityInKilometers();
}
public static float getTemperatureInCelsius每次LocalWeatherDocumentXmlBean实例的扩展方法被调用时,都将调用以上两个方法。
(XmlObject xo) {
.....
}
public static float getVisibilityInKilometers
(XmlObject xo) {
.....
}
scomp -out localinfo_XmlBeans.jar localInfo.xsd localInfo.xsdconfi
SET CLASSPATH=%CLASSPATH%;localinfo_XmlBeans.jar;.;c:\xmlbeans-1.0.3\lib\xbean.jar
javac -d . weatherExtension.java
javac -d . weatherExtensionHandler.java
scomp -out localinfo_XmlBeans.jar localInfo.xsd localInfo.xsdconfig
哇!我们已经准备好了编译并运行包含在示例存档中的基于XMLBeans的客户端应用程序extensionClient.java。
javac extensionClient.java通过使用接口扩展功能,我们已经将附加逻辑从客户端应用程序移至XMLBean Java代码上。现在的代码已集中化并可重用。同时,XMLBean的客户端应用程序变得更简洁精练。
java extensionClient localInfo_68154.xml
<xb:extension for="extension元素的for属性指定了按空间划分的XMLBeans的列表,其中setter方法按照下面LocalWeatherDocumentXmlBean类所展示的那样调用preSet()方法和postSet()方法:
com.weather.LocalWeatherDocumentXmlBean
">
<xb:prePostSet>
<xb:staticHandler>
com.extension.MapPrePostSetHandler
</xb:staticHandler>
</xb:prePostSet>
</xb:extension>
/**以上代码是使用PrePost扩展将生成什么结果的一个示例。注意在set方法和append方法中都调用了pre和post方法。
* Sets the "image" element
*/
public void setMapXmlBean
(com.weather.ImageTypeXmlBean mapXmlBean)
{
synchronized (monitor())
{
check_orphaned();
if ( com.extension.MapPrePostSetHandler.preSet
(1, this, MAPXMLBEAN, false, -1)
)
{
.... Code to set ImageTypeXmlBean instance
}
com.extension.MapPrePostSetHandler.postSet
(1, this, MAPXMLBEAN, false, -1);
}
}
/**
* Appends and returns a new empty "image" element
*/
public com.weather.ImageTypeXmlBean
addNewMapXmlBean()
{
synchronized (monitor())
{
check_orphaned();
com.weather.ImageTypeXmlBean target = null;
if ( com.extension.MapPrePostSetHandler.preSet
(2, this, MAPXMLBEAN, false, -1)
)
{
...
Code to create and return an empty instance
of ImageTypeXmlBean
...
}
com.extension.MapPrePostSetHandler.postSet
(2, this, MAPXMLBEAN, false, -1);
return target;
}
}
public static boolean preSet (int operationType,preSet()方法通知扩展处理器将对XMLBeans对象执行一些设置、插入或删除操作。这是扩展处理程序类必须阻止那个操作的最后机会。
XmlObject xo, QName propertyName,
boolean isAttr, int indexOfItem){
javax.xml.namespace.QName imageQName =
new javax.xml.namespace.QName
("http://www.helloWeather.com/weather","image");
if( (xo instanceof LocalWeather)
&& ( propertyName.equals(imageQName) ) )
{
return false;
}
return true;
}
...
public static void postSet(int operationType,
XmlObject xo, QName propertyName,
boolean isAttr, int indexOfItem)
{}
如果XMLBeans对象是LocalWeather的一个实例,并且要修改的属性是属于http: //www.helloWeather.com/weather名称空间的image元素,我们的MapPrePostSetHandler的 preSet()方法将返回false;否则,返回true。XMLBeans并不提供指定生成的XMLBeans类是否应当具有add、remove或 set方法的功能。如前所述,我们能够在运行期间通过PrePost扩展功能来控制这些方法的流。
操作完成或跳过操作之后,XMLBeans类调用postSet()方法。preSet()方法和postSet()方法的参数如下所示:
int operationType
Type of the operation. Possible values are org.apache.xmlbeans.impl.config.PrePostExtension.OPERATION_SET
for set operations, org.apache.xmlbeans.impl.config.PrePostExtension.OPERATION_INSERT
for add operations, and org.apache.xmlbeans.impl.config.PrePostExtension.OPERATION_REMOVE
for remove operations.
XmlObject xo
Instance of XmlObject
on which the operation is called.
QName propertyName
Qualified name of the element or attribute to be operated on.
boolean isAttr
true
if the property is an attribute, otherwise false
.
int indexOfItem
Index of the item to be set, when an element identified by propertyName allows several values, that is, declares maxOccurs
> 1.
原文出处
http://dev2dev.bea.com/technologies/xmlbeans/articles/Configuring_XMLBeans.jsp