Класс SchemaFactory
- 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 DTD, определённой в XML 1.0.
| значение | язык |
|---|---|
XMLConstants.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 |
- С момента:
- 1.5
Конструкторы
| Модификатор | Конструктор и описание |
|---|---|
protected |
SchemaFactory() Конструктор для производных классов. |
Методы
| Модификатор и тип | Метод и описание |
|---|---|
abstract ErrorHandler |
getErrorHandler() Получение текущего |
boolean |
getFeature(String name) Поиск значения флага функции. |
Object |
getProperty(String name) Поиск значения свойства. |
abstract LSResourceResolver |
getResourceResolver() Получение текущего |
abstract boolean |
isSchemaLanguageSupported(String schemaLanguage) Поддерживает ли эта |
static SchemaFactory |
newInstance(String schemaLanguage) Поиск реализации |
static SchemaFactory |
newInstance(String schemaLanguage,
String factoryClassName,
ClassLoader classLoader) Получение нового экземпляра |
abstract Schema |
newSchema() Создаёт специальный объект |
Schema |
newSchema(File schema) Парсит указанный |
Schema |
newSchema(Source schema) Парсит указанный источник как схему и возвращает её как схему. |
abstract Schema |
newSchema(Source[] schemas) Парсит указанный(ые) источник(и) как схему и возвращает её как схему. |
Schema |
newSchema(URL schema) Парсит указанный |
abstract void |
setErrorHandler(ErrorHandler errorHandler) Устанавливает |
void |
setFeature(String name,
boolean value) Устанавливает функцию для этого |
void |
setProperty(String name,
Object object) Устанавливает значение свойства. |
abstract void |
setResourceResolver(LSResourceResolver resourceResolver) Устанавливает |
Методы, унаследованные от класса java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Конструкторы
SchemaFactory
protected SchemaFactory()
Конструктор для производных классов.
Конструктор ничего не делает.
Производные классы должны создавать объекты SchemaFactory, которые имеют null обработчик ошибок ErrorHandler и null разрёшитель ресурсов LSResourceResolver.
Методы
newInstance
public static SchemaFactory newInstance(String schemaLanguage)
Поиск реализации SchemaFactory, поддерживающей указанный язык схемы и её возвращение.
Для поиска объекта SchemaFactory для заданного языка схемы, этот метод ищет в следующих местах в следующем порядке, где «загрузчик классов» относится к контекстному загрузчику классов:
- Если присутствует системная переменная
"javax.xml.validation.SchemaFactory:schemaLanguage"(где schemaLanguage — параметр этого метода), то её значение считывается как имя класса. Метод попытается создать новый экземпляр этого класса, используя загрузчик классов, и вернёт его, если создание успешно. -
$java.home/lib/jaxp.propertiesсчитывается, и ищется значение, связанное с системной переменной, указанной выше. Если присутствует, значение обрабатывается так же, как и выше. - Используются средства загрузки поставщиков услуг, определённые классом
ServiceLoader, для поиска и загрузки реализации сервиса, используя стандартный механизм загрузки: средство загрузки поставщика услуг будет использовать текущий контекстный загрузчик классов потока для попытки загрузки сервиса. Если контекстный загрузчик классов равен null, будет использован системный загрузчик классов.
Каждый потенциальный поставщик услуг должен реализовать методisSchemaLanguageSupported(String schemaLanguage).
Первый найденный поставщик услуг, поддерживающий указанный язык схемы, возвращается.
В случаеServiceConfigurationErrorбудет брошено исключениеSchemaFactoryConfigurationError. - Платформенный
SchemaFactoryнаходится специфическим для реализации способом. Должен быть платформныйSchemaFactoryдля W3C XML Schema.
Если все попытки окажутся неудачными, будет брошено исключение IllegalArgumentException.
Совет по устранению неполадок:
См. Properties.load(java.io.InputStream), чтобы узнать, как именно анализируется файл свойств. В частности, двоеточия ':' должны быть экранированы в файле свойств, поэтому убедитесь, что URI языка схемы правильно экранированы в нём. Например:
http\://www.w3.org/2001/XMLSchema=org.acme.foo.XSSchemaFactory
- Параметры:
-
schemaLanguage— Указывает язык схемы, который понимает возвращаемый SchemaFactory. См. список доступных языков схем для возможных значений. - Возвращает:
- Новый экземпляр
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. См. список доступных языков схем для возможных значений. -
factoryClassName— Полное имя класса фабрики, предоставляющей реализациюjavax.xml.validation.SchemaFactory. -
classLoader—ClassLoader, используемый для загрузки класса фабрики. Еслиnullиспользуется текущий контекстный загрузчик классовThread. - Возвращает:
- Новый экземпляр
SchemaFactory - Бросает:
-
IllegalArgumentException— еслиfactoryClassNameимеет значениеnull, или класс фабрики не может быть загружен, инициализирован или не поддерживает язык схемы, указанный в параметреschemLanguage. -
NullPointerException— Если параметрschemaLanguageимеет значение null. - С:
- 1.6
- См. также:
newInstance(String schemaLanguage)
isSchemaLanguageSupported
public abstract boolean isSchemaLanguageSupported(String schemaLanguage)
Поддерживается ли указанный язык схемы этим SchemaFactory?
- Параметры:
-
schemaLanguage— Указывает язык схемы, который будет понимать возвращаемыйSchemaFactory.schemaLanguageдолжен указывать действительный язык схемы. - Возвращает:
-
trueеслиSchemaFactoryподдерживаетschemaLanguage, в противном случаеfalse. - Бросает:
-
NullPointerException— ЕслиschemaLanguageимеет значениеnull. -
IllegalArgumentException— ЕслиschemaLanguage.length() == 0илиschemaLanguageне указывают действительный язык схемы.
getFeature
public boolean getFeature(String name)
throws SAXNotRecognizedException,
SAXNotSupportedException Получение значения флага функции.
Имя функции — любой полностью квалифицированный URI. Возможно, что SchemaFactory распознаёт имя функции, но временно не может вернуть её значение.
Реализаторы свободны (и их поощряют) придумывать свои собственные функции, используя имена, основанные на собственных URI.
- Параметры:
-
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 объектов, созданных этой фабрикой, и, как следствие, Validator и 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— Имя функции, которое является непустым полностью квалифицированным 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.
-
Доступ к внешним DTD в файлах схемы ограничен протоколами, указанными в свойстве
XMLConstants.ACCESS_EXTERNAL_DTD. Если доступ запрещен при создании новой схемы из-за ограничения этого свойства,SAXExceptionбудет брошен методомnewSchema(Source)илиnewSchema(File)илиnewSchema(URL)илиnewSchema(Source[]).Доступ к внешним DTD в файлах xml ограничен протоколами, указанными в свойстве
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[]).
- Parameters:
-
name- Имя свойства, которое является непустым полностью квалифицированным URI. -
object- Запрашиваемое значение свойства. - Throws:
-
SAXNotRecognizedException- Если значение свойства нельзя назначить или получить. -
SAXNotSupportedException- КогдаSchemaFactoryраспознаёт имя свойства, но не может установить запрашиваемое значение. -
NullPointerException- Еслиnameявляетсяnull.
getProperty
public Object getProperty(String name)
throws SAXNotRecognizedException,
SAXNotSupportedException Получение значения свойства.
Имя свойства — любой полностью квалифицированный URI. Возможно, что SchemaFactory распознает имя свойства, но временно не может вернуть его значение.
SchemaFactory не обязаны распознавать какие-либо конкретные имена свойств.
Реализаторам разрешено (и рекомендуется) придумывать свои собственные свойства, используя имена, построенные на своих собственных URI.
- Parameters:
-
name- Имя свойства, которое является непустым полностью квалифицированным URI. - Returns:
- Текущее значение свойства.
- Throws:
-
SAXNotRecognizedException- Если значение свойства нельзя назначить или получить. -
SAXNotSupportedException- Когда XMLReader распознаёт имя свойства, но не может определить его значение в данный момент. -
NullPointerException- Еслиnameявляетсяnull. - See Also:
setProperty(String, Object)
setErrorHandler
public abstract void setErrorHandler(ErrorHandler errorHandler)
Устанавливает обработчик ошибок ErrorHandler для получения ошибок, возникших во время вызова метода newSchema.
Обработчик ошибок может использоваться для настройки процесса обработки ошибок во время разбора схемы. Когда установлен ErrorHandler, ошибки, обнаруженные во время разбора схем, будут сначала отправлены в ErrorHandler.
Обработчик ошибок может немедленно прервать разбор схемы, бросив SAXException из обработчика. Или, например, он может вывести ошибку на экран и попытаться продолжить обработку, вернувшись в нормальное состояние из ErrorHandler.
Если любой Throwable (или экземпляры его производных классов) брошены из ErrorHandler, вызывающий метод newSchema будет бросить тот же объект Throwable.
SchemaFactory не разрешается бросать SAXException без предварительного уведомления ErrorHandler.
Приложения могут вызывать этот метод даже во время разбора Schema.
Когда ErrorHandler равен null, реализация будет вести себя так, как если бы был установлен следующий 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, Validator или ValidatorHandler, созданными из этого SchemaFactory.
- Parameters:
-
errorHandler- Новый обработчик ошибок для установки. Этот параметр может бытьnull.
getErrorHandler
public abstract ErrorHandler getErrorHandler()
Получает текущий ErrorHandler, установленный для этого SchemaFactory.
- Returns:
- Этот метод возвращает объект, который был последним установлен с помощью метода
setErrorHandler(ErrorHandler), или null, если этот метод никогда не вызывался с момента создания этогоSchemaFactory. - See Also:
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 {
public LSInput resolveResource(
String publicId, String systemId, String baseURI) {
return null; // always return null
}
} Если LSResourceResolver бросает RuntimeException (или экземпляры его производных классов), то SchemaFactory прервет разбор, и вызывающий метод newSchema получит тот же RuntimeException.
Когда создается новый объект SchemaFactory, по умолчанию это поле равно null. Это поле не наследуется объектами Schema, Validator или ValidatorHandler, созданными из этого SchemaFactory.
- Parameters:
-
resourceResolver- Новый разрешитель ресурсов для установки. Этот параметр может быть null.
getResourceResolver
public abstract LSResourceResolver getResourceResolver()
Получает текущий LSResourceResolver, установленный для этого SchemaFactory.
- Returns:
- Этот метод возвращает объект, который был последним установлен с помощью метода
setResourceResolver(LSResourceResolver), или null, если этот метод никогда не вызывался с момента создания этогоSchemaFactory. - See Also:
setErrorHandler(ErrorHandler)
newSchema
public Schema newSchema(Source schema)
throws SAXException Разбирает указанный источник как схему и возвращает его как схему.
Это метод-утилита для newSchema(Source[] schemas).
- Параметры:
-
schema- Источник, представляющий схему. - Возвращает:
- Новый
Schema, полученный из разбораschema. - Выбрасывает:
-
SAXException- Если во время разбора произошла ошибка SAX. -
NullPointerException- еслиschemaравно null.
newSchema
public Schema newSchema(File schema)
throws SAXException Разбирает указанный File как схему и возвращает его как Schema.
Это удобный метод для newSchema(Source schema).
- Параметры:
-
schema- Файл, представляющий схему. - Возвращает:
- Новый
Schema, полученный из разбораschema. - Выбрасывает:
-
SAXException- Если во время разбора произошла ошибка SAX. -
NullPointerException- еслиschemaравно null.
newSchema
public Schema newSchema(URL schema)
throws SAXException Разбирает указанный URL как схему и возвращает его как Schema.
Это удобный метод для newSchema(Source schema).
- Параметры:
-
schema-URL, представляющий схему. - Возвращает:
- Новый
Schema, полученный из разбораschema. - Выбрасывает:
-
SAXException- Если во время разбора произошла ошибка SAX. -
NullPointerException- еслиschemaравно null.
newSchema
public abstract Schema newSchema(Source[] schemas)
throws SAXException Разбирает указанный источник(ы) как схему и возвращает его как схему.
Вызывающий метод прочитает все Source и объединит их в одну схему. Точные семантики объединения зависят от языка схемы, для которого создан этот объект SchemaFactory.
Когда установлен обработчик ошибок ErrorHandler, вызывающий метод будет сообщать все ошибки, найденные в источниках, обработчику. Если обработчик выбросит исключение, компиляция схемы будет прервана, и то же исключение будет выброшено из этого метода. Также, после сообщения об ошибке обработчику, вызывающему методу разрешается прервать дальнейшую обработку, выбросив её. Если обработчик ошибок не установлен, вызывающий метод выбросит первую ошибку, которую найдёт в источниках.
W3C XML Schema 1.0
Результирующая схема содержит компоненты из указанных источников. Тот же результат был бы достигнут, если бы все эти источники были импортированы, используя соответствующие значения для schemaLocation и namespace, в один документ схемы с другим targetNamespace и без собственных компонентов, если элементы import были указаны в том же порядке, что и источники. Раздел 4.2.3 спецификации XML Schema описывает варианты, которые имеют процессоры в этом отношении. Хотя процессор должен быть последовательным в своём обращении с JAXP источниками схем и импортами XML Schema, поведение между JAXP-совместимыми парсерами может различаться; в частности, парсеры могут выбрать игнорирование всех кроме первого <import> для данного пространства имён, независимо от предоставленной информации в schemaLocation.
Если проанализированный набор схем содержит ошибку(и), как указано в разделе 5.1 спецификации XML Schema, то ошибка должна быть сообщена обработчику 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.
Также реализации могут использовать специфичные для реализации свойства/функции для изменения семантики этого метода.
Реализаторы и разработчики должны уделить особое внимание тому, как функции, установленные в этом SchemaFactory, обрабатываются этим специальным объектом Schema. В некоторых случаях, например, когда SchemaFactory и класс, фактически загружающий схему, происходят из разных реализаций, может быть невозможно автоматически унаследовать функции SchemaFactory. Разработчики должны убедиться, что функции, такие как безопасная обработка, явно установлены в обоих местах.
W3C XML Schema 1.0
Для XML Schema, этот метод создаёт объект Schema, который выполняет валидацию, используя указанные в документах подсказки местоположения.
Возвращаемый объект Schema предполагает, что если документы ссылаются на один и тот же URL в подсказках местоположения схемы, они всегда будут разрешаться к одному и тому же документу схемы. Это предположение позволяет реализациям повторно использовать проанализированные результаты документов схем, чтобы многократные валидации против одной и той же схемы выполнялись быстрее.
Обратите внимание, что использование подсказок местоположения схем создаёт уязвимость к атакам типа "отказ в обслуживании".
RELAX NG
RELAX NG не поддерживает эту операцию.
- Возвращает:
- Всегда возвращает не null допустимый объект
Schema. - Выбрасывает:
-
UnsupportedOperationException- Если эта операция не поддерживается вызывающим методом. -
SAXException- Если эта операция поддерживается, но завершилась неудачей по какой-то причине.
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.