public abstract class SchemaFactory extends Object
Schema
对象的工厂。
入口点到验证API。
SchemaFactory
是一个模式编译器。 它读取模式的外部表示,并准备它们进行验证。
SchemaFactory
类不是线程安全的。 换句话说,应用程序有责任确保在任何给定的时刻最多有一个线程使用SchemaFactory
对象。 鼓励实施方法标记为synchronized
以保护自己免受破坏的客户端。
SchemaFactory
不是入门的 。 虽然正在调用其中一个newSchema
方法,但应用程序可能不会尝试递归调用newSchema
方法,即使是从同一个线程。
此规范使用命名空间URI来指定模式语言。 下表显示了本规范定义的值。
为了符合规范,实施只需要支持W3C XML Schema 1.0。 但是,如果选择支持此处列出的其他模式语言,则必须符合本规范中描述的相关行为。
这里未列出的模式语言预计将引入自己的URI来表示自己。 SchemaFactory
类能够在运行时为其他架构语言定位其他实现。
请注意,由于XML DTD与解析过程密切相关,并且对解析过程有重大影响,因此无法将DTD验证定义为独立于解析的过程。 因此,本规范未定义XML DTD的语义。 这并不能阻止实现者以合适的方式实现它,但是用户被警告说,在该接口上实现的任何DTD验证必然偏离XML 1.0中定义的XML DTD语义 。
value languageXMLConstants.W3C_XML_SCHEMA_NS_URI
("http://www.w3.org/2001/XMLSchema
") W3C XML Schema 1.0 XMLConstants.RELAXNG_NS_URI
("http://relaxng.org/ns/structure/1.0
") RELAX NG 1.0
Modifier | Constructor and Description |
---|---|
protected |
SchemaFactory()
派生类的构造方法
|
Modifier and Type | Method and Description |
---|---|
abstract ErrorHandler |
getErrorHandler()
获得当前 ErrorHandler 设置为此SchemaFactory 。
|
boolean |
getFeature(String name)
查找特征标记的值。
|
Object |
getProperty(String name)
查找属性的值。
|
abstract LSResourceResolver |
getResourceResolver()
获得当前 LSResourceResolver 设置为SchemaFactory 。
|
abstract boolean |
isSchemaLanguageSupported(String schemaLanguage)
指定的模式是否支持此
SchemaFactory ?
|
static SchemaFactory |
newInstance(String schemaLanguage)
在查找的实现
SchemaFactory 支持指定模式语言,并将其返回。
|
static SchemaFactory |
newInstance(String schemaLanguage, String factoryClassName, ClassLoader classLoader)
从类名获取一个新的实例
SchemaFactory 。
|
abstract Schema |
newSchema()
创建一个特殊的 Schema 对象。
|
Schema |
newSchema(File schema)
将指定的File
File 为模式,并将其作为
Schema 返回。
|
Schema |
newSchema(Source schema)
将指定的源解析为模式,并将其作为模式返回。
|
abstract Schema |
newSchema(Source[] schemas)
将指定的源解析为模式并将其作为模式返回。
|
Schema |
newSchema(URL schema)
将指定的URL
URL 为模式,并将其作为
Schema 返回。
|
abstract void |
setErrorHandler(ErrorHandler errorHandler)
设置 ErrorHandler 以接收newSchema 方法调用期间newSchema 错误。
|
void |
setFeature(String name, boolean value)
设置了一个功能,这个 SchemaFactory , Schema 个此工厂创建S,推而广之, Validator 个 S和ValidatorHandler 那些创建小号Schema 秒。
|
void |
setProperty(String name, Object object)
设置属性的值。
|
abstract void |
setResourceResolver(LSResourceResolver resourceResolver)
设置 LSResourceResolver 以在解析模式时自定义资源分辨率。
|
public static SchemaFactory newInstance(String schemaLanguage)
在查找的实现SchemaFactory
支持指定模式语言,并将其返回。
要找到给定模式语言的SchemaFactory
对象,该方法按照以下顺序查找以下位置,其中“类加载器”是指上下文类加载器:
"javax.xml.validation.SchemaFactory:schemaLanguage"
存在(其中schemaLanguage是此方法的参数),则将其值作为类名读取。 该方法将尝试通过使用类加载器来创建此类的新实例,并且如果成功创建则返回此类。 $java.home/lib/jaxp.properties
被读取,并且查找与上述系统属性的键相关联的值。 如果存在,该值将像上面那样处理。 ServiceLoader
类定义的服务提供商加载工具尝试使用default loading mechanism定位并加载服务的实现 :服务提供商加载工具将使用current thread's context class loader尝试加载服务。 如果上下文类加载器为null, 那么将使用system class loader 。 isSchemaLanguageSupported(String schemaLanguage)
。 ServiceConfigurationError
一个SchemaFactoryConfigurationError
将被抛出。 SchemaFactory
位于实现具体的方式。 对于W3C XML Schema,必须有一个默认的平台SchemaFactory
。 如果一切都失败, IllegalArgumentException
将被抛出。
故障排除提示:
有关如何解析属性文件,请参阅Properties.load(java.io.InputStream)
。 特别地,冒号:'需要在属性文件中进行转义,因此请确保模式语言URI在其中正确转义。 例如:
http\://www.w3.org/2001/XMLSchema=org.acme.foo.XSSchemaFactory
schemaLanguage
- 指定返回的SchemaFactory将理解的模式语言。
有关可能的值,请参阅the list of available schema languages 。
SchemaFactory
IllegalArgumentException
- 如果没有模式语言的实现可用。
NullPointerException
- 如果
schemaLanguage
参数为空。
SchemaFactoryConfigurationError
- 如果遇到配置错误。
newInstance(String schemaLanguage, String factoryClassName, ClassLoader classLoader)
public static SchemaFactory newInstance(String schemaLanguage, String factoryClassName, ClassLoader classLoader)
从类名获取一个新的实例SchemaFactory
。 SchemaFactory
如果指定的工厂类名支持指定模式语言返回。 在类路径中有多个提供程序时,此功能很有用。 它可以更好地控制应用程序,因为它可以指定应该加载哪个提供程序。
设置jaxp.debug
系统属性将导致此方法打印大量调试消息到System.err
关于它正在做什么和在哪里看。
如果您有问题,请尝试:
java -Djaxp.debug=1 YourProgram ....
schemaLanguage
- 指定返回的SchemaFactory
将理解的架构语言。
有关可能的值,请参见the list of available schema languages 。
factoryClassName
-完全限定工厂类名称,提供实施
javax.xml.validation.SchemaFactory
。
classLoader
- ClassLoader
用于加载工厂类。
如果null
当前的Thread
的上下文classLoader用于加载工厂类。
SchemaFactory
IllegalArgumentException
- 如果
factoryClassName
是
null
,或者工厂类无法加载,实例化或不支持schemLanguage参数中
schemLanguage
的模式语言。
NullPointerException
- 如果
schemaLanguage
参数为空。
newInstance(String schemaLanguage)
public abstract boolean isSchemaLanguageSupported(String schemaLanguage)
这个SchemaFactory
是否支持指定的模式?
schemaLanguage
- 指定返回的SchemaFactory
将理解的架构语言。
schemaLanguage
必须指定一个valid模式语言。
true
如果
SchemaFactory
支持
schemaLanguage
,否则
false
。
NullPointerException
- 如果
schemaLanguage
是
null
。
IllegalArgumentException
- 如果
schemaLanguage.length() == 0
或
schemaLanguage
未指定
valid模式语言。
public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException
name
- 功能名称,它是非空的完全限定URI。
SAXNotRecognizedException
- 如果无法分配或检索到特征值。
SAXNotSupportedException
- 当SchemaFactory
识别功能名称,但此时无法确定其值。
NullPointerException
- 如果
name
是
null
。
setFeature(String, boolean)
public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException
设置了一个功能,这个SchemaFactory
, Schema
个此工厂创建S,推而广之, Validator
个 S和ValidatorHandler
那些创建小号Schema
秒。
实施者和开发人员应特别注意如何处理由newSchema()
返回的特殊Schema
对象。 在某些情况下,例如,当SchemaFactory
和实际加载模式的类来自不同的实现时, SchemaFactory
功能可能无法自动继承。 开发人员应确保在两个地方明确设置诸如安全处理等功能。
功能名称是任何完全限定的URI。 SchemaFactory
可以公开特征值,但无法更改当前值。
所有实现都需要支持XMLConstants.FEATURE_SECURE_PROCESSING
功能。 当功能是:
true
:实现将限制XML处理以符合实现限制。 示例包括enity扩展限制和消耗大量资源的XML Schema结构。 如果XML处理由于安全原因而受到限制,则将通过对已注册的ErrorHandler.fatalError(SAXParseException exception)
的呼叫进行报告。 见setErrorHandler(ErrorHandler errorHandler)
。 false
:实现将根据XML规范处理XML,而不考虑可能的实现限制。 name
- 特征名称,它是非空的完全限定URI。
value
- 要素的值(true或false)。
SAXNotRecognizedException
- 如果不能分配或检索到特征值。
SAXNotSupportedException
- 当SchemaFactory
识别功能名称但无法设置请求的值时。
NullPointerException
- 如果
name
是
null
。
getFeature(String)
public void setProperty(String name, Object object) throws SAXNotRecognizedException, SAXNotSupportedException
属性名称是任何完全限定的URI。 SchemaFactory
可以识别属性名称,但无法更改当前值。
实现JAXP 1.5或更高版本的所有实现都需要支持XMLConstants.ACCESS_EXTERNAL_DTD
和XMLConstants.ACCESS_EXTERNAL_SCHEMA
属性。
访问模式文件中的外部DTD仅限于XMLConstants.ACCESS_EXTERNAL_DTD
属性指定的协议 。 如果访问被创造新模式的过程中,由于该物业的限制否认, SAXException
将被抛出newSchema(Source)
或newSchema(File)
或newSchema(URL)
或或newSchema(Source[])
方法。
访问xml源文件中的外部DTD仅限于XMLConstants.ACCESS_EXTERNAL_DTD
属性指定的协议 。 如果访问被验证过程中,由于该物业的限制否认, SAXException
将被抛出Validator.validate(Source)
或Validator.validate(Source, Result)
方法。
由schemaLocation属性访问外部引用集仅限于XMLConstants.ACCESS_EXTERNAL_SCHEMA
属性指定的协议 。 如果访问被验证过程中,由于该物业的限制否认, SAXException
将被抛出Validator.validate(Source)
或Validator.validate(Source, Result)
方法。
由Import和Include元素访问外部引用设置仅限于XMLConstants.ACCESS_EXTERNAL_SCHEMA
属性指定的协议 。 如果访问被创造新模式的过程中,由于该物业的限制否认, SAXException
将被抛出newSchema(Source)
或newSchema(File)
或newSchema(URL)
或newSchema(Source[])
方法。
name
- 属性名称,它是非空的完全限定的URI。
object
- 该物业所需的价值。
SAXNotRecognizedException
- 如果不能分配或检索属性值。
SAXNotSupportedException
- 当SchemaFactory
识别属性名称但无法设置请求的值时。
NullPointerException
- 如果
name
是
null
。
public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException
属性名称是任何完全限定的URI。 SchemaFactory
可以识别属性名称,但暂时无法返回其值。
SchemaFactory
s不需要识别任何特定的属性名称。
实施者是免费的(并被鼓励)发明自己的属性,使用自己的URI建立的名称。
name
- 属性名称,它是非空的完全限定URI。
SAXNotRecognizedException
- 如果不能分配或检索属性值。
SAXNotSupportedException
- 当XMLReader识别属性名称,但此时无法确定其值。
NullPointerException
- 如果
name
是
null
。
setProperty(String, Object)
public abstract void setErrorHandler(ErrorHandler errorHandler)
ErrorHandler
以接收在newSchema
方法调用期间newSchema
错误。
错误处理程序可用于在模式解析期间自定义错误处理过程。 当设置ErrorHandler
时,解析模式期间发现的错误将首先发送到ErrorHandler
。
错误处理程序可以通过从处理程序中抛出SAXException
来立即中止方案的解析。 或者例如它可以在屏幕上打印一个错误,并尝试通过从ErrorHandler
正常返回来继续处理
如果任何Throwable
(或其衍生类的实例)从ErrorHandler
抛出,则newSchema
方法的调用者将抛出相同的Throwable
对象。
SchemaFactory
不允许抛出SAXException
没有首先报告给ErrorHandler
。
即使在Schema
被解析时,应用程序也可以调用此方法。
当ErrorHandler
为空时,实现将表现为如下设置以下ErrorHandler
:
class DraconianErrorHandler implements ErrorHandler
{
public void fatalError( SAXParseException
e ) throws SAXException
{
throw e;
}
public void error( SAXParseException
e ) throws SAXException
{
throw e;
}
public void warning( SAXParseException
e ) throws SAXException
{
// noop
}
}
当创建一个新的SchemaFactory
对象时,最初该字段设置为null。 此字段不会被继承到Schema
个 S, Validator
个 S,或ValidatorHandler
个 S中的从这个创建SchemaFactory
。
errorHandler
- 要设置的新的错误处理程序。
该参数可以是null
。
public abstract ErrorHandler getErrorHandler()
ErrorHandler
设置为此SchemaFactory
。
setErrorHandler(ErrorHandler)
方法最后设置的对象,如果该方法从未调用,则为null,因为此SchemaFactory
已创建。
setErrorHandler(ErrorHandler)
public abstract void setResourceResolver(LSResourceResolver resourceResolver)
LSResourceResolver
以在解析模式时自定义资源分辨率。
SchemaFactory
在解析模式时需要定位外部资源时使用LSResourceResolver
,尽管构成“定位外部资源”的方式取决于每个模式语言。 例如,对于W3C XML Schema,这包括文件<include>
d或<import>
ed,以及从模式文件引用的DTD等。
即使在Schema
被解析时,应用程序也可以调用此方法。
当LSResourceResolver
为空时,实现将表现为如下设置以下LSResourceResolver
:
class DumbDOMResourceResolver implements LSResourceResolver
{
public LSInput
resolveResource(
String publicId, String systemId, String baseURI) {
return null; // always return null
}
}
如果LSResourceResolver
抛出一个RuntimeException
(或其派生类的实例),则SchemaFactory
将中止解析和的呼叫者newSchema
方法将接收相同RuntimeException
。
当创建一个新的SchemaFactory
对象时,最初该字段设置为null。 该字段不会被继承为Schema
s, Validator
s或ValidatorHandler
s,这是从此SchemaFactory
创建的。
resourceResolver
- 要设置的新资源解析器。
此参数可以为null。
public abstract LSResourceResolver getResourceResolver()
LSResourceResolver
设置为此SchemaFactory
。
setResourceResolver(LSResourceResolver)
方法最后设置的对象,如果该方法从未调用,则为null,因为此SchemaFactory
已创建。
setErrorHandler(ErrorHandler)
public Schema newSchema(Source schema) throws SAXException
将指定的源解析为模式,并将其作为模式返回。
这是一个方便的方法newSchema(Source[] schemas)
。
schema
- 表示模式的源。
Schema
从解析
schema
。
SAXException
- 如果解析期间发生SAX错误。
NullPointerException
- 如果
schema
为空。
public Schema newSchema(File schema) throws SAXException
将指定的File File
为模式,并将其作为Schema
返回。
这是一个方便的方法newSchema(Source schema)
。
schema
- 表示模式的文件。
Schema
从解析
schema
。
SAXException
- 解析时是否发生SAX错误。
NullPointerException
- 如果
schema
为空。
public Schema newSchema(URL schema) throws SAXException
将指定的URL URL
为模式,并将其作为Schema
返回。
这是一个方便的方法newSchema(Source schema)
。
schema
-
URL
,表示一个模式。
Schema
从解析
schema
。
SAXException
- 解析时是否发生SAX错误。
NullPointerException
- 如果
schema
为空。
public abstract Schema newSchema(Source[] schemas) throws SAXException
被调用者将读取所有Source
并将它们组合成一个模式。 组合的确切语义取决于创建此SchemaFactory
对象的模式语言。
当设置了一个ErrorHandler
时,被调用者将向处理程序报告源中发现的所有错误。 如果处理程序引发异常,它将中止模式编译,并从该方法抛出相同的异常。 此外,在将错误报告给处理程序之后,被叫方可以通过抛出来中止进一步的处理。 如果未设置错误处理程序,则被调用者将在源中抛出第一个错误。
生成的模式包含指定源的组件。 如果将所有这些源都使用适用于schemaLocation和命名空间的值导入到具有不同targetNamespace的单个模式文档中,并且导入元素的顺序与源的顺序相同,那么将实现相同的结果。 XML Schema建议的第4.2.3节介绍了处理器在这方面的选择。 处理器在处理JAXP模式源和XML Schema导入时应该是一致的,JAXP兼容解析器之间的行为可能会有所不同; 特别地,解析器可以选择忽略除了第一个<import>对于给定的命名空间,而不管schemaLocation中提供的信息。
如果解析的模式集合包含XML Schema规范第5.1节中指定的错误,则该错误必须报告给ErrorHandler
。
对于RELAX NG,这种方法必须抛出UnsupportedOperationException
如果schemas.length!=1
。
schemas
- 要解析的输入。
SchemaFactory
需要认识到SAXSource
, StreamSource
, StAXSource
和DOMSource
。
输入模式必须是XML文档或XML元素,且不能为null。
为了向后兼容,传递文档或元素以外的任何结果都是依赖于实现的。
实现必须识别和处理输入或抛出IllegalArgumentException。
Schema
对象。
请注意,当报告错误时,不保证返回的Schema
对象是有意义的。
SAXException
- 如果在处理指定的输入期间发现错误。
当设置了ErrorHandler
时,首先会报错。
见setErrorHandler(ErrorHandler)
。
NullPointerException
- 如果
schemas
参数本身为空或数组中的任何项为空。
IllegalArgumentException
- 如果该方法中没有识别到数组中的任何项目。
UnsupportedOperationException
- 如果模式语言不支持此操作。
public abstract Schema newSchema() throws SAXException
Schema
对象。
返回的Schema
对象的确切语义取决于创建此SchemaFactory
的模式语言。
此外,允许实现使用实现特定的属性/功能来改变此方法的语义。
实施者和开发人员应该特别注意这个SchemaFactory
所设置的功能如何处理这个特殊的Schema
。 在某些情况下,例如,当SchemaFactory
和类实际加载模式来自不同的实现时, SchemaFactory
功能可能无法自动继承。 开发人员应确保在两个地方明确设置诸如安全处理等功能。
对于XML模式,此方法创建一个Schema
对象,通过使用文档中指定的位置提示来执行验证。
返回的Schema
对象假设如果文档引用模式位置提示中的相同URL,则它们将始终解析为同一模式文档。 此asusmption允许实现重用解析文档的结果,以便针对相同模式的多个验证运行速度更快。
请注意,使用模式位置提示会引入拒绝服务攻击的漏洞。
RELAX NG不支持此操作。
Schema
对象。
UnsupportedOperationException
- 被调用者不支持此操作。
SAXException
- 如果此操作受支持但由于某些原因失败。