Castor XML 映射文件
概述:
Castor 映射是一种隔离Java对象模型因XML文档格式变化而变化的好方法。
映射信息是由一个XML文档来指定的。这个从Java对象的角度来编写,描述了对象的属性如何转换到XML。映射文件的一个约束是,Castor应该能够在解组时无疑议地把给定的XML元素、属性转换到对象模型。
映射文件描述了每个对象的每个字段如何映射到XML。字段是对象属性的抽象。它可以直接等价于一个公有的类变量或简介等价于一个属性,通过获取器方法(setter和getter)。
可以混合使用映射和Castor默认行为:当Castor处理一个对象或XML数据,但找不到有关信息时,它将依赖它的默认行为。Castor将使用Java反射API来内审Java对象来决定做什么。
注意:Castor不能处理所有可能的映射。在一些复杂的情况下,它可能需要依赖一个XSL转换来以更友好的格式生成XML文档。
编组行为:
对于Castor,一个Java类映射为一个XML element。编组一个对象时:
使用任何的映射信息来查找要创建的element的名字,或者;默认地,使用类名作为element名字。
使用映射文件里的fields信息来决定一个对象的给定属性转换到下列中的一种,且仅一种:
一个属性;
一个元素;
文本内容;
空,如果选择忽略一个特定的field。
这种处理是递归的:如果Castor找到一个属性的类型是任何其他映射文件里指定的,它将使用这个信息来编组对象。
默认地,如果Castor没有找到映射文件里类的映射信息,将内省(introspect )类,应用默认的规则来猜测字段,编组它们。默认的规则是:
A.所有基本类型和它们的包装类型编组为属性;
B.所有的对象类型编组为元素,带有文本内容活元素内容。
解组行为:
当Castor解组文档时找到一个元素时,将尝试使用映射信息来决定实例化哪个对象。如果没有映射信息,Castor将使用元素名字来猜测要实例化的类名 (for example, for an element named 'test-element', Castor will try to instantiate a class named 'TestElement' if no information is given in the mapping file)。Castor将使用映射文件里的字段映射信息来处理元素内容。
如果类没有在映射文件里描述,Castor将使用Java 的反射内省类,来判断是否存在getter/setter。这些获取器与名为’xxx-yyy’ 的XML元素/属性。
如果没有获取器,Castor将直接获取,在这种情况下,Castor将查找公有域。
映射文件
<mapping>元素
<mapping>元素是映射文件的根元素,它包含:
A.一个可选的description元素;
B.零个或多个<include>机制来重用映射文件;
C.零个或多个<field-handler>来定义定制的、可配置的field处理器;
D.零个或多个<class>描述,每个类我们希望给出映射信息;
E.零个或多个<key-generator>,没有用于XML映射。
一个映射文件看起来是这样的:
<map-to>元素
<map-to>用于指定给定类关联的元素名。<map-to>只能用于根<class>,如果没有指定此元素,Castor将使用默认规则进行匹配。
属性
<field>元素
<field>用于描述希望编组或解组的Java 对象的属性。他包含:
标识(‘name’),类型(由type和collection推断)、获取方法(由‘direct’、‘get-method’,’set-method’推断)。
为了了确定Castor期望的签名,应用了两个简单的规则:
1.<type>决定。如果没有'collection'属性,type就仅仅是指定的Java类型。Type属性可以是全限定的Java 类名或预定义的简称。
类型名简称
注意lcation属性,这个属性的值是包装元素的名字。为了使用多于一个的包装元素,name用/分割:<bind-xml name="bar" location="abc/xyz" />
Note that the name of the element is not part of the location itself and that the location is always relative to the class in which the field is being defined. This works for attributes also:
完整的映射文件可参看 映射模式的示例。