- java.lang.Object
-
- javax.xml.validation.SchemaFactory
-
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语义 。
URIs for Supported Schema languages value languageXMLConstants.W3C_XML_SCHEMA_NS_URI
("http://www.w3.org/2001/XMLSchema
") W3C XML Schema 1.0XMLConstants.RELAXNG_NS_URI
("http://relaxng.org/ns/structure/1.0
") RELAX NG 1.0- 从以下版本开始:
- 1.5
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
SchemaFactory()
派生类的构造方法
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 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
newDefaultInstance()
创建一个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
解析为模式,并将其作为Schema
返回。Schema
newSchema(URL schema)
将指定的URL
解析为模式,并将其作为Schema
返回。Schema
newSchema(Source schema)
将指定的源解析为模式,并将其作为模式返回。abstract Schema
newSchema(Source[] schemas)
将指定的源解析为模式并将其作为模式返回。abstract void
setErrorHandler(ErrorHandler errorHandler)
设置ErrorHandler
以接收在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
以在解析模式时自定义资源分辨率。
-
-
-
方法详细信息
-
newDefaultInstance
public static SchemaFactory newDefaultInstance()
创建一个SchemaFactory
内建系统默认实现的新实例。- 实现要求:
-
SchemaFactory
内建系统默认实现只需要支持 W3C XML Schema 1.0 ,但可以支持额外的 schema languages 。 - 结果
-
SchemaFactory
内建系统默认实现的新实例。 - 从以下版本开始:
- 9
-
newInstance
public static SchemaFactory newInstance(String schemaLanguage)
查找支持指定的模式语言并返回的SchemaFactory
的实现。要为给定的模式语言找到一个
SchemaFactory
对象,该方法按照以下顺序查看以下位置,其中“类加载器”是指上下文类加载器:如果系统属性
"javax.xml.validation.SchemaFactory:<i>schemaLanguage</i>"
存在(其中schemaLanguage是此方法的参数),则将其值作为类名读取。 该方法将尝试通过使用类加载器来创建此类的新实例,并且如果成功创建则返回此类。使用配置文件“jaxp.properties”。 该文件采用标准
Properties
格式,通常位于Java安装的conf目录中。 它包含实现类的完全限定名称,其中键是上面定义的系统属性。jaxp.properties文件由JAXP实现只读一次,然后将其值缓存以备将来使用。 如果文件第一次尝试读取文件不存在,则不再进一步检查其存在。 在第一次读取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必须有platform defaultSchemaFactory
。
如果一切都失败,将会抛出
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)
-
newInstance
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
参数中指定的模式语言。 -
NullPointerException
- 如果schemaLanguage
参数为空。 - 从以下版本开始:
- 1.6
- 另请参见:
-
newInstance(String schemaLanguage)
-
isSchemaLanguageSupported
public abstract boolean isSchemaLanguageSupported(String schemaLanguage)
这个SchemaFactory
支持的指定模式?- 参数
-
schemaLanguage
- 指定返回的SchemaFactory
将会理解的架构语言。schemaLanguage
必须指定一个valid模式语言。 - 结果
-
true
如果SchemaFactory
支持schemaLanguage
,否则false
。 - 异常
-
NullPointerException
- 如果schemaLanguage
是null
。 -
IllegalArgumentException
- 如果schemaLanguage.length() == 0
或schemaLanguage
未指定 valid模式语言。
-
getFeature
public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException
- 参数
-
name
- 功能名称,它是非空的完全限定URI。 - 结果
- 特征的当前值(true或false)。
- 异常
-
SAXNotRecognizedException
- 如果无法分配或检索到特征值。 -
SAXNotSupportedException
- 当SchemaFactory
识别功能名称,但此时无法确定其值。 -
NullPointerException
- 如果name
是null
。 - 另请参见:
-
setFeature(String, boolean)
-
setFeature
public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException
设置了一个功能,这个SchemaFactory
,Schema
个此工厂创建S,推而广之,Validator
个 S和ValidatorHandler
那些创建小号Schema
秒。实现者和开发人员应该特别注意如何特殊
Schema
通过返回的对象newSchema()
被处理。 在某些情况下,例如,当SchemaFactory
和实际加载模式的类来自不同的实现时,SchemaFactory
功能可能无法自动继承。 开发人员应确保在两个地方明确设置诸如安全处理等功能。功能名称是任何完全限定的URI。
SchemaFactory
可以公开特征值,但无法更改当前值。所有实现都需要支持
XMLConstants.FEATURE_SECURE_PROCESSING
功能。 当功能是:-
true
:实现将限制XML处理以符合实现限制。 示例包括将消耗大量资源的实体扩展限制和XML模式构造。 如果XML处理由于安全原因而受到限制,则通过对已注册的ErrorHandler.fatalError(SAXParseException exception)
的呼叫进行报告。 见setErrorHandler(ErrorHandler errorHandler)
。 -
false
:实现将根据XML规范处理XML,而不考虑可能的实现限制。
- 参数
-
name
- 特征名称,它是非空的完全限定URI。 -
value
- 要素的值(true或false)。 - 异常
-
SAXNotRecognizedException
- 如果功能值无法分配或检索。 -
SAXNotSupportedException
-SchemaFactory
识别功能名称但无法设置请求的值时。 -
NullPointerException
- 如果name
是null
。 - 另请参见:
-
getFeature(String)
-
-
setProperty
public void setProperty(String name, Object object) throws SAXNotRecognizedException, SAXNotSupportedException
设置属性的值。属性名称是任何完全限定的URI。
SchemaFactory
可以识别属性名称,但无法更改当前值。实现JAXP 1.5或更高版本的所有实现都需要支持
XMLConstants.ACCESS_EXTERNAL_DTD
和XMLConstants.ACCESS_EXTERNAL_SCHEMA
属性。在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
。
-
getProperty
public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException
查找属性的值。属性名称是任何完全限定的URI。
SchemaFactory
可以识别属性名称,但暂时无法返回其值。SchemaFactory
不需要识别任何特定的属性名称。实施者是免费的(并被鼓励)发明自己的属性,使用自己的URI建立的名称。
- 参数
-
name
- 属性名称,它是非空的完全限定URI。 - 结果
- 当前的属性值。
- 异常
-
SAXNotRecognizedException
- 如果不能分配或检索属性值。 -
SAXNotSupportedException
- 当XMLReader识别属性名称,但此时无法确定其值。 -
NullPointerException
- 如果name
是null
。 - 另请参见:
-
setProperty(String, Object)
-
setErrorHandler
public abstract void setErrorHandler(ErrorHandler errorHandler)
设置ErrorHandler
以接收newSchema
方法调用期间遇到的错误。错误处理程序可用于在模式解析期间自定义错误处理过程。 当设置
ErrorHandler
时,解析模式期间发现的错误将首先发送到ErrorHandler
。错误处理程序可以通过从处理程序中抛出
SAXException
来立即中止解析模式。 或者,例如它可以在屏幕上打印一个错误,并尝试通过从ErrorHandler
正常返回来继续处理如果从
ErrorHandler
抛出任何Throwable
(或其派生类的实例),则将抛出newSchema
方法的调用者相同的Throwable
对象。SchemaFactory
不允许扔SAXException
没有首先报告给ErrorHandler
。即使在
Schema
被解析时,应用程序也可以调用此方法。当
ErrorHandler
为空时,实现将表现为如下ErrorHandler
设置:class DraconianErrorHandler implements
ErrorHandler
{ public void fatalError(SAXParseException
e ) throwsSAXException
{ throw e; } public void error(SAXParseException
e ) throwsSAXException
{ throw e; } public void warning(SAXParseException
e ) throwsSAXException
{ // noop } }当创建一个新的
SchemaFactory
对象时,最初该字段设置为null。 此字段不会被继承到Schema
个 S,Validator
个 S,或ValidatorHandler
个 S中的从这个创建SchemaFactory
。- 参数
-
errorHandler
- 要设置的新的错误处理程序。 该参数可以是null
。
-
getErrorHandler
public abstract ErrorHandler getErrorHandler()
获取当前的ErrorHandler
设置为SchemaFactory
。- 结果
-
此方法返回是通过最后一组对象
setErrorHandler(ErrorHandler)
方法,则返回null,因为这是方法从未被称为SchemaFactory
创造。 - 另请参见:
-
setErrorHandler(ErrorHandler)
-
setResourceResolver
public abstract void setResourceResolver(LSResourceResolver resourceResolver)
设置LSResourceResolver
以在解析模式时自定义资源分辨率。SchemaFactory
在解析模式时需要定位外部资源时使用LSResourceResolver
,尽管构成“定位外部资源”的方式取决于每个模式语言。 例如,对于W3C XML Schema,这包括文件<include>
d或<import>
ed,以及从模式文件引用的DTD等。即使在解析
Schema
期间,应用程序也可以调用此方法。当
LSResourceResolver
为null时,实现将表现为如下LSResourceResolver
设置:class DumbDOMResourceResolver implements
LSResourceResolver
{ publicLSInput
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。
-
getResourceResolver
public abstract LSResourceResolver getResourceResolver()
获取当前的LSResourceResolver
设置为SchemaFactory
。- 结果
-
此方法返回是通过最后一组对象
setResourceResolver(LSResourceResolver)
方法,则返回null,因为这是方法从未被称为SchemaFactory
创造。 - 另请参见:
-
setErrorHandler(ErrorHandler)
-
newSchema
public Schema newSchema(Source schema) throws SAXException
将指定的源解析为模式,并将其作为模式返回。这是一个方便的方法
newSchema(Source[] schemas)
。- 参数
-
schema
- 表示模式的源。 - 结果
-
新
Schema
从解析schema
。 - 异常
-
SAXException
- 如果解析期间发生SAX错误。 -
NullPointerException
- 如果schema
为空。
-
newSchema
public Schema newSchema(File schema) throws SAXException
将指定的File
解析为模式,并将其作为Schema
返回。这是一个方便的方法
newSchema(Source schema)
。- 参数
-
schema
- 表示模式的文件。 - 结果
-
新的
Schema
从解析schema
。 - 异常
-
SAXException
- 如果解析期间发生SAX错误。 -
NullPointerException
- 如果schema
为空。
-
newSchema
public Schema newSchema(URL schema) throws SAXException
将指定的URL
解析为架构,并将其作为Schema
返回。这是一个方便的方法
newSchema(Source schema)
。- 参数
-
schema
-URL
,表示一个模式。 - 结果
-
新
Schema
从解析schema
。 - 异常
-
SAXException
- 解析时是否发生SAX错误。 -
NullPointerException
- 如果schema
为空。
-
newSchema
public abstract Schema newSchema(Source[] schemas) throws SAXException
将指定的源解析为模式并将其作为模式返回。被调用者将读取所有的
Source
,并将它们组合成一个模式。 组合的确切语义取决于创建此SchemaFactory
对象的模式语言。当设置了一个
ErrorHandler
时 ,被调用者将向处理程序报告源中发现的所有错误。 如果处理程序引发异常,它将中止模式编译,并从该方法抛出相同的异常。 此外,在将错误报告给处理程序之后,被叫方可以通过抛出来中止进一步的处理。 如果未设置错误处理程序,则被调用者将在源中抛出第一个错误。W3C XML Schema 1.0
生成的模式包含指定源的组件。 如果将所有这些源都使用适用于schemaLocation和命名空间的值导入到具有不同targetNamespace的单个模式文档中,并且导入元素的顺序与源的顺序相同,那么将实现相同的结果。 XML Schema建议的第4.2.3节介绍了处理器在这方面的选择。 处理器在处理JAXP模式源和XML Schema导入时应该是一致的,JAXP兼容解析器之间的行为可能会有所不同; 特别是,解析器可能会选择忽略给定命名空间的第一个
<import>
,而不管schemaLocation中提供的信息如何。如果解析的模式集包含XML Schema规范第5.1节中指定的错误,则该错误必须报告给
ErrorHandler
。RELAX NG
对于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
- 如果模式语言不支持此操作。
-
newSchema
public abstract Schema newSchema() throws SAXException
创建一个特殊的Schema
对象。返回的
Schema
对象的确切语义取决于创建此SchemaFactory
的模式语言。此外,允许实现使用实现特定的属性/功能来改变此方法的语义。
实施者和开发人员应特别注意
SchemaFactory
的功能如何处理,由特殊的Schema
处理 。 在某些情况下,例如,当SchemaFactory
和类实际加载模式来自不同实现时,SchemaFactory
功能可能无法自动继承。 开发人员应确保在两个地方明确设置诸如安全处理等功能。W3C XML Schema 1.0
对于XML Schema,此方法创建一个
Schema
对象,通过使用文档中指定的位置提示来执行验证。返回的
Schema
对象假设如果文档引用模式位置提示中的相同URL,则它们将始终解析为同一模式文档。 此asusmption允许实现重用解析文档的结果,以便针对相同模式的多个验证运行速度更快。请注意,使用模式位置提示会引入拒绝服务攻击的漏洞。
RELAX NG
RELAX NG不支持此操作。
- 结果
-
始终返回非空有效的
Schema
对象。 - 异常
-
UnsupportedOperationException
- 被叫方不支持此操作。 -
SAXException
- If this operation is supported but failed for some reason.
-
-