14.6. Проверка документа XML на соответствие схеме
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.
Пример 14.15. Включение режима подтверждения схемы при использовании XercesDOMParser
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 в значение места расположения схемы.
Например, пусть требуется проверить документ animals.xml из примера 14.1, используя схему из примера 14.16. Один из способов заключается в добавлении ссылки на схему в документ animals.xml, как показано в примере 14.17. После этого вы можете проверить документ, используя программный интерфейс SAX2, как показано в примере 14.13, или используя DOM, как показано в примере 14.14 с учетом модификаций, выполненных в примере 14.15.
Пример 14.16. Схема animals.xsd для файла animals.xml
<?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">
<xsd:restriction base="xsd:string">
<xsd:pattern value="(d{3})d{3}-d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
Пример 14.17. Модифицированный файл animals.xml, содержащий ссылку на схему
<?xml version="1.0" encoding="UTF-8"?>
<!- Животные цирка Feldman Family Circus со схемой -->
<animalList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemalocation="animals.xsd">
<!- Так же, как в примере 14.1 -->
</animalList>
Можно поступить по-другому: опустить ссылку на схему и включить режим подтверждения соответствия документа внешней схеме. Пример 14.18 показывает, как это можно сделать при использовании парсера DOM.
Пример 14.18. Подтверждение соответствия документа XML внешней схеме, используя DOM
/*
* Те же самые операторы #include, которые использовались в примере 14.14
*/
using namespace std;
using namespace xercesc;
/*
* Определить XercesInitializer, как в примере 14.8,
* и CircusErorHandler, как в примере 14.7
*/
int main() {
try {
// Инициализировать Xerces и сконструировать парсер DOM.
XercesInitializer init;
XercesDOMParser parser;
// Включить проверку
parser.setValidationScheme(XercesDOMParser::Val_Always);
parser.setDoSchema(true); parser.setDoNamespaces(true);
parser.setExternalNoNamespaceSchemaLocation(
fromNative("animals.xsd").c_str());
// Зарегистрировать обработчик ошибок для получения уведомлений о
// нарушениях схемы
CircusErrorHandler handler;
parser.setErrorHandler(&handler);
// Выполнить синтаксический анализ и проверить соответствие документа
// схеме.
parser parse("animals.xml");
} catch (const SAXException& e) {
cout << "xml error: " << toNative(e.getMessage()) << " ";
return EXIT_FAILURE;
} catch (const XMLException& e) {
cout << "xml error: " << toNative(e.getMessage()) << " ";
return EXIT_FAILURE;
} catch (const exception& e) {
cout << e.what() << " ";
return EXIT_FAILURE;
}
}
Обсуждение
Подобно определениям DTD, рассмотренным в предыдущем рецепте, схемы накладывают ограничения на документы XML. Схема предназначена для определения подмножества правильно сформированных документов, характерных для определенной прикладной области. Однако схемы имеют три отличия от определений DTD. Во-первых, концепция DTD и связанное с ней понятие подтверждения достоверности (validity) определены в самой спецификации XML, в то время как схемы описаны в другой спецификации — в рекомендациях XML Schema. Во-вторых, сами схемы являются правильно сформированными документами XML, в то время как для описания определений DTD используется специальный синтаксис, продемонстрированный в примере 14.11. В-третьих, схемы существенно более выразительны, чем определения DTD. Из-за двух последних отличий считается, что схемы превосходят определения DTD.
Например, в DTD из примера 14.11 можно было лишь потребовать, чтобы элементы veterinarian имели ровно два атрибута, name и phone, значения которых состоят из символов. Напротив, схема в примере 14.16 требует, чтобы значение атрибута phone, кроме того, соответствовало регулярному выражению (d{3})d{3}-d{4}, т.е. чтобы оно имело вид (ddd)xxx-dddd, где d может быть любой цифрой. Аналогично обстоит дело с элементом dateOfBirth: если в DTD можно было только потребовать, чтобы этот элемент имел текстовое значение, то схема требует, чтобы текстовое значение имело вид yyyy-mm-dd, где yyyy задается в диапазоне от 0001 до 9999, mm — от 01 до 12, a dd — от 01 до 31.
Способность накладывать эти дополнительные ограничения создает большое преимущество, поскольку позволяет часть программистской работы переложить на парсер.
Смотри также
Рецепт 14.5.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
10.14 Соответствие требованиям разработчика
10.14 Соответствие требованиям разработчика Текущий стандарт TCP требует, чтобы реализации твердо придерживались процедуры медленного старта при инициализации соединения и использовали алгоритмы Керна и Джекобсона для оценки тайм-аута повторной отправки данных и
Свойства документа
Свойства документа Работая с документами Word, часто необходимо сохранить их свойства, то есть указать, что представляет собой данный документ, кто занимается его созданием и редактированием, вынести ключевые слова и заметки. Это особенно актуально для документов, которые
2.3. Масштаб документа
2.3. Масштаб документа Масштаб помогает увеличить или уменьшить размер документа, который выводится на экран. Масштаб влияет исключительно на вид документа на экране компьютера, а не на изображение, получаемое при печати! Используя масштаб, можно увидеть сразу большое
Проверка документа вручную
Проверка документа вручную Автоматическая проверка не всегда удобна. Например, если в тексте много иностранных слов, подчеркивание будет отвлекать. В этом случае при наборе проверку правописания лучше отключить, а потом проверить текст полностью, просматривая каждую
4.8. Темы документа
4.8. Темы документа В Word 2007 появился новый инструмент для быстрого форматирования текстов – тема документа. По сути, тема представляет собой коллекцию разных типов стилей, которые гармонично сочетаются между собой.Благодаря этому темы документа дают возможность быстро
Приложение В Соответствие правил во втором и третьем изданиях
Приложение В Соответствие правил во втором и третьем изданиях Третье издание «Эффективного использования C++» во многом отличается от второго, так как содержит много новой информации. Однако большая часть материала из второго издания осталась и в третьем, хотя часто и в
14.5. Проверка документа XML на соответствие определению DTD
14.5. Проверка документа XML на соответствие определению DTD ПроблемаТребуется проверить документ XML на соответствие DTD.РешениеИспользуйте библиотеку Xerces с парсером SAX2 (простой программный XML-интерфейс) или с парсером DOM.Для проверки документа XML при использовании SAX2 получите
Соответствие между типами библиотеки базовых классов .NET, C# и CIL
Соответствие между типами библиотеки базовых классов .NET, C# и CIL В табл. 15.4 показано соответствие между типами базовых классов .NET и ключевыми словами C#, а также между ключевыми словами C# и командами CIL. Там же представлены сокращенные обозначения констант, используемые для
3.1. Модель данных и ее соответствие модели процессов
3.1. Модель данных и ее соответствие модели процессов Функциональная модель BPwin является основой для построения модели данных. Действительно, не имея информации о том, как работает предприятие, бессмысленно строить модель данных. Для построения модели данных удобно
Приложение А. Соответствие между 19 смертными грехами и «10 ошибками» OWASP
Приложение А. Соответствие между 19 смертными грехами и «10 ошибками» OWASP В январе 2004 года организация «Открытый проект по безопасности Web–приложений» (Open Web Application Security Project – OWASP) опубликовала документ, озаглавленный «Десять самых критичных уязвимостей Web–приложений»
А.2.6.3 Соответствие (Conformance)
А.2.6.3 Соответствие (Conformance) Атрибуты программного обеспечения, которые заставляют программу подчиняться стандартам или соглашениям, относящимся к
2.7. Проверяем соответствие реальных параметров ПК заявленной конфигурации
2.7. Проверяем соответствие реальных параметров ПК заявленной конфигурации Внимание! Материал данного раздела предусматривает наличие минимальных навыков работы с компьютером. Если у вас таковых нет, можете смело его пропустить — когда прочитаете несколько следующих
Полное соответствие
Полное соответствие Завершая обсуждение ковариантности, полезно понять, как общий метод можно применить к решению достаточно общей проблемы. Метод появился как результат Кэтколл-теории, но может использоваться в рамках базисного варианта языка без введения новых
Параметры документа
Параметры документа К сожалению, Flash 8 не позволит нам задать параметры (в частности, его размеры и цвет фона) документа прямо при его создании, как было в предыдущих версиях Flash. Для этого нам придется выбрать пункт Document в меню Modify или нажать комбинацию клавиш <Ctrl>+<J>.