XML和java数据类型间的映射
Datatypes 在XMLSchema1.0的时候就很流行了,被很多其他XML规范所应用,像 XPath,XQuery,WSDL等。大部分的数据类型可以映射到java的基本数据类型或包装过的数据类型。其他的类型如:dataTime, duration
可以被映射到新的java数据类型: javax.xml.datatype.XMLGregorianCalendar,javax.xml.datatype.Duration, and javax.xml.namespace.QName. 这样XMLSchema1.0 XPath 2.0 和XQuery 1.0中所有数据类型,JAVA中都有对应的类型存在。
从可用性角度看,如果DatatypeFactory有方法能够生成一个对应WXS中数据类型的java对象,并且这个java对象拥有方法能根据facets限制数据类型和根据值来校验数据类型,这样就非常好了。
一个使用Oracle's XDK的例子:
import oracle.xml.parser.schema.*;
. . .
//create a simpleType object
XSDSimpleType st = XSDSimpleType.getPrimitiveType(XSDSimpleType.iSTRING);
//set a constraining facet on the simpleType
st.setFacet(XSDSimpleType.LENGTH, "5");
//validate value
st.validateValue("hello");
底层实现间的切换
一个JAXP的实现通常包括一个默认的解析器,转换器,xpath引擎和schema校验器,但是就像文章开始的时候所提到的那样,JAXP是一个可插拔的API,我们可以插入我们自己的处理器来替换JAXP默认的处理器。要实现这样的切换,我们可以通过设置属性 javax.xml.xxx.yyyFactory的值来指定一个合格的factory的实现类。当yyyFactory.newInstance()被调用的时候,JAXP使用如下的顺序查找需要装载的具体的实现类:
1.使用javax.xml.xxx.yyyFactory属性指定的值.
2.使用 JRE 目录下lib/jaxp.properties 属性文件。Jaxp.properties文件只被读入一次,它的值会被缓存已被将来所用。如果第一次尝试去读这个文件而此文件不存在的话,以后就不会尝试着去检查此文件是否存在。jaxp.properties里面的值第一次读过之后,就不可能被修改了。
3.如果可以地话,可以使用 Services API(在JAR的规范里有详细的信息)来决定哪个实现类被载入。Services API会在runtime时存在的jars的META-INF/services/javax.xml.xxx.yyyFactory里寻找那个 classname。
4.使用平台默认的javax.xml.xxx.yyyFactory 实例。
javax.xml.xxx.yyyFactory 可是下面其中的一个:
javax.xml.parsers.SAXParserFactory
javax.xml.parsers.DocumentBuilderFactory
javax.xml.transform.TransformerFactory
javax.xml.xpath.XPathFactory
javax.xml.validation.SchemaFactory:schemaLanguage (schemaLanguage 是调用SchemaFactory的newInstance函数时所提供的参数)
例如:想在JAXP中使用SAX解析器,你可以用上面提到的4个方法中的任何一个把javax.xml.parsers.SAXParserFactory设为org.apache.xerces.jaxp.SAXParserFactoryImpl。
其中的一个方法如下:
java -Djavax.xml.parsers.SAXParserFactory=
org.apache.xerces.jaxp.SAXParserFactoryImpl MyApplicationProgram
