- 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
-
-
构造方法摘要
构造方法 变量 构造器 描述 protected
SchemaFactory()
派生类的构造函数。
-
方法摘要
所有方法 静态方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 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
参数为null。 -
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
参数为null。 - 从以下版本开始:
- 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
- 功能名称,它是一个非null的完全限定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 Schema构造。 如果出于安全原因限制XML处理,则将通过调用已注册的ErrorHandler.fatalError(SAXParseException exception)
进行报告。 见setErrorHandler(ErrorHandler errorHandler)
。 -
false
:该实现将根据XML规范处理XML,而不考虑可能的实现限制。
- 参数
-
name
- 功能名称,它是一个非null的完全限定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
- 属性名称,它是一个非null的完全限定URI。 -
object
- 属性的请求值。 - 异常
-
SAXNotRecognizedException
- 如果无法分配或检索属性值。 -
SAXNotSupportedException
- 当SchemaFactory
识别属性名称但无法设置请求的值时。 -
NullPointerException
- 如果name
是null
。
-
getProperty
public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException
查找属性的值。属性名称是任何完全限定的URI。
SchemaFactory
可以识别属性名称但暂时无法返回其值。SchemaFactory
s不需要识别任何特定的属性名称。实现者可以免费(并鼓励)使用基于自己的URI构建的名称来创建自己的属性。
- 参数
-
name
- 属性名称,它是一个非null的完全限定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
为null时,实现的行为就像设置了以下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)
方法最后设置的对象,如果从SchemaFactory
创建以来从未调用过该方法,则返回null。 - 另请参见:
-
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)
方法最后设置的对象,如果自创建此SchemaFactory
后从未调用过该方法,则返回null。 - 另请参见:
-
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和namespace的适当值导入到具有不同targetNamespace且没有自己的组件的单个模式文档中,如果导入元素的顺序与源相同,则可以获得相同的结果。 XML Schema建议的4.2.3节描述了处理器在这方面的选项。 虽然处理器在处理JAXP模式源和XML模式导入时应该是一致的,但JAXP兼容解析器之间的行为可能会有所不同; 特别是,无论schemaLocation中提供的信息如何,解析器都可以选择忽略除给定命名空间的第一个
<import>
所有<import>
。如果解析的模式集包含XML Schema规范的5.1节中指定的错误,则必须将错误报告给
ErrorHandler
。RELAX NG
对于RELAX NG,这种方法必须抛出
UnsupportedOperationException
如果schemas.length!=1
。- 参数
-
schemas
- 要解析的输入。SchemaFactory
需要认识到SAXSource
,StreamSource
,StAXSource
和DOMSource
。 输入模式必须是XML文档或XML元素,并且不能为null。 为了向后兼容,传递除文档或元素之外的任何内容的结果都是依赖于实现的。 实现必须识别并处理输入或抛出IllegalArgumentException。 - 结果
-
始终返回非null有效的
Schema
对象。 请注意,报告错误时,无法保证返回的Schema
对象有意义。 - 异常
-
SAXException
- 如果在处理指定输入期间发现错误。 设置ErrorHandler
时, 首先会向其报告错误。 见setErrorHandler(ErrorHandler)
。 -
NullPointerException
- 如果schemas
参数本身为null或数组中的任何项为null。 -
IllegalArgumentException
- 如果此方法无法识别数组中的任何项目。 -
UnsupportedOperationException
- 如果架构语言不支持此操作。
-
newSchema
public abstract Schema newSchema() throws SAXException
创建一个特殊的Schema
对象。返回的
Schema
对象的确切语义取决于为其创建此SchemaFactory
的模式语言。此外,允许实现使用特定于实现的属性/功能来更改此方法的语义。
实现者和开发人员应特别注意此特殊
Schema
如何处理此SchemaFactory
上设置的功能。 在某些情况下,例如,当SchemaFactory
和实际加载模式的类来自不同的实现时,SchemaFactory
功能可能无法自动继承。 开发人员应确保在两个位置都明确设置了安全处理等功能。W3C XML Schema 1.0
对于XML Schema,此方法创建一个
Schema
对象,该对象使用文档中指定的位置提示执行验证。返回的
Schema
对象假定如果文档在架构位置提示中引用相同的URL,它们将始终解析为相同的架构文档。 此asusmption允许实现重用模式文档的解析结果,以便针对同一模式的多个验证运行得更快。请注意,使用架构位置提示会导致拒绝服务攻击的漏洞。
RELAX NG
RELAX NG不支持此操作。
- 结果
-
始终返回非null有效的
Schema
对象。 - 异常
-
UnsupportedOperationException
- 如果被叫方不支持此操作。 -
SAXException
- If this operation is supported but failed for some reason.
-
-