примерах 14.13 и 14.14. Аналогично парсер DOMBuilder
, описанный в рецепте 14 4, может проверять достоверность документа XML, вызывая свой метод setFeaturе()
с аргументами fgXMLUni::fgDOMValidation
и true
.
Классы
SAX2XMLReader
, DOMBuilder
, DOMWriter
и XercesDOMParser
поддерживают ряд дополнительных функций. В SAX2XMLReader
и DOMBuilder
вы можете включать эти функции, используя методы setFeature()
и setProperty()
. Первый метод принимает строку и булево значение: второй метод принимает строку и void*
. Запросить включенные функции можно с помощью методов getFeature()
и getProperty()
. Для удобства в Xerces предусмотрены константы с именами фикций и свойств. Класс DOMWriter
поддерживает setFeature()
, но не поддерживает setProperty()
. Класс XercesDOMParser
поддерживает оба метода, в нем предусмотрены отдельные методы по установке и получению каждой функции. В документации Xerces вы найдете полный список поддерживаемых дополнительных функций.
Рецепт 14.6.
14.6. Проверка документа XML на соответствие схеме
Требуется подтвердить соответствие документа XML схеме, представленной в рекомендациях XML Schema 1.0.
Используйте библиотеку Xerces совместно с программным интерфейсом SAX2 или с парсером DOM.
Подтверждение соответствия документа XML схеме с использованием программного интерфейса SAX2 осуществляется точно так же, как подтверждение достоверности документа, содержащего DTD, когда схема содержится внутри целевого документа или когда на нее делается ссылка в этом документе. Если требуется проверить документ XML на соответствие внешней схеме, вы должны вызвать метод парсера setProperty()
для включения режима подтверждения внешней схемы. В качестве первого аргумента setProperty()
необходимо использовать XMLUni::fgXercesSchemaExternalSchemaLocation
или XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation
в зависимости оттого, используется или нет в схеме целевое пространство имен. Второй аргумент должен определять место расположения схемы, представленное значением типа const XMLCh*
. Не забудьте привести тип второго аргумента к void*
, как это сделано в рецепте 14.5.
Подтверждение соответствия документа XML схеме на основе использования XercesDOMParser
выполняется аналогично подтверждению достоверности документа DTD, когда схема содержится внутри целевого документа или когда на нее делается ссылка в этом документе. Единственное отличие заключается в явном подключении средств поддержки схемы и пространства имен, как показано в примере 14.15.
XercesDOMParser parser;
parser.setValidationScheme(XercesDOMParser::Val_Always);
parser.setDoSchema(true);
parser setDoNamespaces(true);
Если требуется проверить документ XML на соответствие внешней схеме, имеющей целевое пространство имен, вызовите метод парсера setExternalSchemaLocation()
, передавая в качестве аргумента место расположения вашей схемы. Если требуется проверить документ XML на соответствие внешней схеме, не имеющей целевого пространства имен, вызовите метод парсера setExternalNoNamespaceSchemaLocation()
.
Аналогично для проверки документа XML на соответствие схемы с использованием DOMBuilder
включите функцию подтверждения достоверности следующим образом.
DOMBuilder* parser = ...;
parser->setFeature(XMLUni::fgDOMNamespaces, true);
parser->setFeature(XMLUni::fgDOMValidation, true);
parser->setFeature(XMLUni::fgXercesSchema, true);
Для подтверждения соответствия документа внешней схеме с использованием DOMBuilder
установите свойство XMLUni::fgXercesSchemaExternalSchemaLocation
или XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation
в значение места расположения схемы.
Например, пусть требуется проверить документ
<?xml version='1.0' encoding='UTF-8'?>
<!- Схема для животных цирка Feldman Family Circus -->
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'
elementFormDefault='qualified'>
<xsd:element name='animalList'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='animal' minOccurs='0' maxOccurs='unbounded'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='name' type='xsd:string' />
<xsd:element name='species' type='xsd:string'/>
<xsd:element name='dateOfBirth' type='xsd:date'/>
<xsd:element name='veterinarian' type='contact'/>
<xsd:element name='trainer' type='contact'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name='contact'>
<xsd:attribute name='name' type='xsd:string'/>
<xsd:attribute name='phone' type='phone'/>
</xsd:complexType>
<xsd:simpleType name='phone'>