- 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
-
-
构造方法摘要
构造方法 变量 构造器 描述 protectedSchemaFactory()派生类的构造函数。
-
方法摘要
所有方法 静态方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 abstract ErrorHandlergetErrorHandler()获取当前ErrorHandler设置为这个SchemaFactory。booleangetFeature(String name)查找功能标志的值。ObjectgetProperty(String name)查找属性的值。abstract LSResourceResolvergetResourceResolver()获取当前LSResourceResolver设置为此SchemaFactory。abstract booleanisSchemaLanguageSupported(String schemaLanguage)此SchemaFactory是否支持指定的架构?static SchemaFactorynewDefaultInstance()创建SchemaFactory内置系统默认实现的新实例。static SchemaFactorynewInstance(String schemaLanguage)查找支持指定模式语言并返回它的SchemaFactory的实现。static SchemaFactorynewInstance(String schemaLanguage, String factoryClassName, ClassLoader classLoader)从类名获取SchemaFactory的新实例。abstract SchemanewSchema()创建一个特殊的Schema对象。SchemanewSchema(File schema)将指定的File解析为模式并将其作为Schema返回。SchemanewSchema(URL schema)将指定的URL解析为模式并将其作为Schema返回。SchemanewSchema(Source schema)将指定的源解析为模式并将其作为模式返回。abstract SchemanewSchema(Source[] schemas)将指定的源解析为模式并将其作为模式返回。abstract voidsetErrorHandler(ErrorHandler errorHandler)设置ErrorHandler以接收newSchema方法调用期间遇到的错误。voidsetFeature(String name, boolean value)设置了一个功能,这个SchemaFactory,Schema个此工厂创建S,推而广之,Validator个 S和ValidatorHandler那些创建小号Schema秒。voidsetProperty(String name, Object object)设置属性的值。abstract voidsetResourceResolver(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可以识别属性名称但暂时无法返回其值。SchemaFactorys不需要识别任何特定的属性名称。实现者可以免费(并鼓励)使用基于自己的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 implementsErrorHandler{ public void fatalError(SAXParseExceptione ) throwsSAXException{ throw e; } public void error(SAXParseExceptione ) throwsSAXException{ throw e; } public void warning(SAXParseExceptione ) 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 implementsLSResourceResolver{ publicLSInputresolveResource( 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.
-
-