Если требуется проверить документ 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

 elementFormDefault="qualified">

 

 

  

   

    

      

       

       

       

       

       

      

     

    

   

  

 

 

 

 

 

 

 

  

 

 

Пример 14.17. Модифицированный файл animals.xml, содержащий ссылку на схему

 xsi:noNamespaceSchemalocation="animals.xsd">

Можно поступить по-другому: опустить ссылку на схему и включить режим подтверждения соответствия документа внешней схеме. Пример 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()) << "\n";

  return EXIT_FAILURE;

 } catch (const XMLException& e) {

  cout << "xml error: " << toNative(e.getMessage()) << "\n";

  return EXIT_FAILURE;

 } catch (const exception& e) {

  cout << e.what() << "\n";

  return EXIT_FAILURE;

 }

}

Обсуждение
Перейти на страницу:

Похожие книги