<
  • Главная
Статьи

Покращена валідація XML

  1. пояснення
  2. Schematron
  3. Малюнок 1. Затвердження за допомогою Schematron
  4. Малюнок 2. Валідація за допомогою XSLT і Java розширення
  5. Лістинг 1. Що входить XML документ
  6. Лістинг 2. Приклад перетворення даних співробітника
  7. Лістинг 3. Вихідний документ
  8. Лістинг 4. Клас ValidationException
  9. Лістинг 6. Просте перетворення з декількома обмеженнями
  10. Лістинг 7. Детальний повідомлення про помилку
  11. Лістинг 8. Логіка перетворення
  12. Лістинг 10. Довідкові дані
  13. Лістинг 11. Валідація зовнішніх даних
  14. Ресурси для скачування

Валідація сукупності обмежень в XML документі, використовуючи XSLT і Java розширення

пояснення

Засновані на граматиці мови валідації, такі як XML схема і DTD, можуть гарантувати, що XML документи відповідають чітко структурованого повідомленням. Це забезпечує правильну обробку вхідних XML повідомлень отримують додатками, але не гарантує, що дані, що містяться в повідомленнях, є допустимими. Обмеження граматики мов валідації, означають, наприклад, що вам доведеться використовувати різні методи, щоб перевірити існуючі та встановити нові обмеження проти змінних і зовнішніх даних.

У багатьох випадках, логіка валідації, яку ви не можете впровадити в XML схему або DTD, вбудована в код програми. Дане рішення відносно легко для впровадження, але найчастіше результати негнучкий в реалізації. Ця стаття - перше дослідження Schematron як можливості вирішення описаних вище проблем, і потім висвітлюються деякі недоліки в даному підході. Також дана стаття досліджує альтернативне рішення, яке використовує добре обґрунтовані компоненти W3C стандарту в сукупності з Java розширеннями і загальнодоступними XSLT процесорами.

Schematron

Одне з широко поширених рішень для удосконалення XML схеми - використання Schematron. Schematron - це заснований на правилах мову, що використовує XPath для вираження тверджень про вміст певному XML документі. Він зроблений шляхом об'єднання Schematron схеми з основами таблиці стилів, яка перетворює схему в таблицю стилів XSLT. Таблиця стилів перевіряє певні твердження в процесі обробки окремо взятого XML документа XSLT процесором. Результат трансформації - звіт в XML форматі, який містить інформацію про твердженнях, які не були виконані, з коментарями, передбаченими певним правилом схеми. Schematron, тим не менш, не дуже добре підходить для визначення структури, що тут же стає важким завданням. Потреба спочатку в звірена документа з XML схемою тому залишається, але разом XML схема і Schematron можуть охопити вимоги до валідації більшості додатків. Насправді, через те що обмеження Schematron не належать до простору імен граматики XML схеми, удвох вони можуть бути включені в один файл і потім бути розділені як частини процесу валідації документа.

Малюнок 1 описує логічні ступені обробки досить загального сценарію додатків. Спочатку XSLT валідірует окремий вихідний XML документ і потім трансформує його, перед там як даний документ або буде оброблений даним додатком, або посланий зовнішньому додатком. Як видно з діаграми, це стає складною операцією при використанні комбінації XML Schema і Schematron: спочатку виконання валідації і потім перетворення завіреного документа, використовуючи таблицю стилів XSLT. Ви можете скоротити процес шляхом поділу схем і перетворення схеми Schematron заздалегідь, але це все ще вимагає два проходи через XSLT процесор для граматичної перевірки і вивчення звіту про валідацію, наданим витягнутим перетворенням Schematron.

Малюнок 1. Затвердження за допомогою Schematron

недоліки Schematron

  • Вам потрібно перетворити схему Schematron як мінімум один раз, використовуючи основну таблицю стилів, перед тим як ви зможете використовувати її для валідації XML документа.
  • Schematron на даний момент не може надати звіт назад з додатком. Вам потрібно запустити після валідації етап підготовки звіту або вручну, або автоматично.

XSLT і Java розширення

В даному розділі я розглядаю XSLT з розширеннями Java в якості альтернативи для сукупності заснованих на граматиці способів валідації XML схеми, з заснованим на правилах підходом. Я надам вам кілька простих прикладів, які покажуть, як це відбувається. Вказівки про те, як здійснювати XML валідацію, використовуючи XML схему, не прикладається, тому що дане питання досить широко висвітлений в інших статтях і посібниках на сайті developerWorks (див. ресурси ).

на малюнку 2 зображений той же сценарій що і на малюнку 1 , Але з використанням XSLT з Java розширеннями для виконання валідації перетворення на одному етапі. Замість надання звіту, який вам потрібно зробити окремо, помилка при валідації передається безпосередньо в управління додаток в якості об'єкта класу ValidationException, який є розширенням класу Exception. Крім того зменшення кількості XSLT оброблювачів документа повинне бути схожим крізь, перетворення зупиняється в разі першої помилки при валідації, що в результаті перешкоджає небажаної обробці неприпустимих даних.

Малюнок 2. Валідація за допомогою XSLT і Java розширення

Просте перетворення XML документа

Для демонстрації використання XSLT і Java при валідації, я просто перетворю реєстр, який містить інформацію про співробітника, таку як ім'я, номер телефону, соціальний статус і підлогу в якості прикладу. Як ви пізніше побачите дані про соціальний статус і поле є центром в прикладі обмежень. лістинг 1 містить частину вхідного XML документа.

Лістинг 1. Що входить XML документ
<Input: staff xmlns: input = "cross-field-validation-namespace"> ... <input: employee id = "1234A"> <input: first_name> Julia </ input: first_name> <input: last_name> Smith < / input: last_name> <input: title> Mrs </ input: title> <input: gender> F </ input: gender> <input: telephones> <input: mobile preferred = "false"> 0770-555 тисячі двісті тридцять одна </ input: mobile> <input: mobile preferred = "true"> 0771-555 один тисячу двісті тридцять дві </ input: mobile> <input: home preferred = "false"> 0207-555 1 233 </ input: home> </ input: telephones> </ input: employee> ... </ input: staff>

Простим перетворенням в даному прикладі є послідовність з імені та прізвища, що міститься в реєстрі співробітника. Перетворення так Він підіймає номер телефону, з присвоєнням атрибуту preferred значення true, як показано в лістингу 2 .

Лістинг 2. Приклад перетворення даних співробітника
<Xsl: stylesheet xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" xmlns: xalan = "http://xml.apache.org/xslt" xmlns: input = "cross-field-validation-namespace"> <xsl: template match = "/ input: staff"> <phones> <xsl: apply-templates select = "input: employee" /> </ phones> </ xsl: template> <xsl: template match = "input: employee"> <employee> <name> <xsl: value-of select = "concat (input: first_name, '', input: last_name)" /> </ name> < tel> <xsl: value-of select = "input: telephones / * [@ preferred = 'true']" /> </ tel> </ employee> </ xsl: template> </ xsl: stylesheet>

лістинг 3 демонструє вихідний документ, створений шляхом перетворення вихідного документа за допомогою XSLT з лістингу 2 .

Лістинг 3. Вихідний документ
<Phones xmlns: input = "cross-field-validation-namespace" xmlns: exception = "xfield.exception.ValidationExceptionThrower" xmlns: xalan = "http://xml.apache.org/xslt"> <employee> <name> Julia Smith </ name> <tel> 0771-555 1 232 </ tel> </ employee> <employee> <name> John Smith </ name> <tel> 0207-555 тисячі двісті тридцять шість </ tel> </ employee> <employee > <name> Jenny Smith </ name> <tel> 0770-555 1237 </ tel> </ employee> </ phones>

Реалізація простий валідації на накладені обмеження

Два дуже простих класу Java - все, що вам потрібно для передачі помилок при валідації безпосередньо керуючому з додатком через XSLT процесор. Для цього вам потрібно створити класи ValidationException і ValidationExceptionThrower. Клас ValidationException є простим розширенням стандартного класу Exception і дозволяє контролювати додаток для розрізнення між помилок при валідації та інших невідповідності, викладених оброблювачем. Клас ValidationExceptionThrower просто викидає ValidationException, коли викликається його метод throwException. Відділення класу обов'язково з таких міркувань. Коли ви використовуєте в XSLT розширення Java, не представляється можливим використовувати звичайний Java синтаксис throw для викидання виключення. Ви можете тільки використовувати Java розширення для XSLT при створенні об'єктів і виклику методів. У лістингах 4 і 5 наведено весь вихідний код двох класів, необхідних для реалізації Java розширень.

Лістинг 4. Клас ValidationException
package xfield.exception; public class ValidationException extends Exception {public ValidationException (String sMsg) {super (sMsg); } // кінець конструктора} // кінець класу
Лістинг 5. Клас ValidationExceptionThrower
package xfield.exception; public class ValidationExceptionThrower {public ValidationExceptionThrower () {// Порожній} // кінець конструктора public void throwException (String sMessage) throws Exception {throw new ValidationException (sMessage); } // кінець throwException} // кінець класу

Перевірка декількох обмежень

Як уже згадувалося раніше, спосіб звернення і підлогу можуть бути використані в якості прикладу кількох обмежень. Ви можете перевірити, що елементи обігу та статі відповідають один одному, наприклад, якщо звернення містер, то підлога повинна бути M - чоловічим. Валідація даних елементів окремо зазвичай робиться за допомогою XML Schema і не обговорюється в даній статті.

Для проведення валідації помістіть код перетворення в елемент <otherwise /> блок елементів <choose /> і перевіряйте виконання умови test в блоці <when ​​/>. Якщо в разі валідації вийде значення false, це означає, що валідація завершилася успішно і тоді виповнюється код перетворення. У разі повернення значення true, використовується Java розширення для виклику методу throwException () об'єкта, класу ValidationExceptionThrower. Зверніть увагу на додавання простору імен з префіксом exception, в якому міститься ім'я класу і пакетів, що містяться в кореневому елементі XSLT. Префікс, потім використовується в якості імені об'єкта для виклику методу throwException (), що містить рядок в якості аргументу. Повертаючись до коду Java для класу ValidationExceptionThrower, легко простежити, як викидається виключення ValidationException, яке містить рядок з помилкою, яка прийшла з XSLT

Для перевірки подальших винятків додайте необхідні умови в елементі <when ​​/>, які містять необхідні повідомлення про помилки, що передаються в якості аргументів методів.

Лістинг 6. Просте перетворення з декількома обмеженнями
<Xsl: stylesheet xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" xmlns: xalan = "http://xml.apache.org/xslt" xmlns: exception = "xfield.exception.ValidationExceptionThrower" xmlns: input = "cross-field-validation-namespace"> ... <xsl: template match = "input: employee"> <xsl: choose> <xsl: when test = "input : gender = 'M' and input: title! = 'Mr' or input: gender = 'F' and input: title = 'Mr' "> <xsl: value-of select =" exception: throwException ( 'Gender and title do not match ') "/> </ xsl: when> <xsl: otherwise> <employee> <name> <xsl: value-of select =" concat (input: first_name,' ', input: last_name) "/> </ name> <tel> <xsl: value-of select = "input: telephones / * [@ preferred = 'true']" /> </ tel> </ employee> </ xsl: otherwise> </ xsl: choose> </ xsl: template> </ xsl: stylesheet>

Додавання виразів XPath до повідомлення про помилку, див. лістинг 7 , Дозволяє одержати більш докладне повідомлення про помилку валідації, яке значно полегшує виявлення проблеми.

Лістинг 7. Детальний повідомлення про помилку
<Xsl: when test = "input: gender = 'M' and input: title! = 'Mr' or input: gender = 'F' and input: title = 'Mr'"> <xsl: value-of select = " exception: throwException (concat ( 'Gender and title do not match for employee', input: first_name, '', input: last_name)) "/> </ xsl: when>

Поділ валідації і перетворення

Якщо необхідно поділ логіки валідації і перетворення, то ви можете використовувати стандартну директиву <include /> для посилання на проведення валідації та виконання даних перевірок спільно з перетворенням. В лістингу 8 показаний код перетворення, де в тезі <include /> міститься посилання на файл validate.xsl. Зверніть увагу на виклик шаблону validate; важливо, що виклик збігається з ім'ям шаблону, що містить перевірки у включається файлі, показаному в лістингу 9 .

Лістинг 8. Логіка перетворення
<Xsl: stylesheet xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" xmlns: xalan = "http://xml.apache.org/xslt" xmlns: input = "cross-field-validation-namespace"> <xsl: include href = "validate.xsl" /> <xsl: template match = "/"> <xsl: call-template name = "validate" /> <phones> <xsl: apply-templates /> </ phones> </ xsl: template> <xsl: template match = "input: staff / input: employee"> <employee> <name> <xsl: value-of select = "concat (input: first_name, '', input: last_name) "/> </ name> <tel> <xsl: value-of select =" input: telephones / * [@ preferred = 'true'] "/> </ tel > </ employee> </ xsl: template> </ xsl: stylesheet>
Listing 9. Логіка валідації
<Xsl: stylesheet xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" xmlns: xalan = "http://xml.apache.org/xslt" xmlns: exception = "xfield.exception.ValidationExceptionThrower" xmlns: input = "cross-field-validation-namespace"> <xsl: template name = "validate"> <xsl: for-each select = "/ input: staff / input: employee" > <xsl: if test = "input: gender = 'M' and input: title! = 'Mr' or input: gender = 'F' and input: title = 'Mr'"> <xsl: value-of select = "exception: throwException ( 'Gender and title do not match')" /> </ xsl: if> </ xsl: for-each> </ xsl: template> </ xsl: stylesheet>

Валідація за зовнішніми даними

XML Schema може використовувати перерахування для порівняння вхідних даних з наперед визначеним набором допустимих значень, проте посилальні дані є змінною, що містить відносини, і в XML Schema не існує способу перевірки цих даних. В даному прикладі показано рішення, яке використовує XSLT і Java розширення для перевірки змінних і зовнішніх наборів XML даних. Зауважте, що Schematron також надає цю обмежену функціональність, так як перетворені дані використовують XSLT для здійснення валідації.

Лістинг 10. Довідкові дані
<Roles> ... <employee id = "1234A" role = "A" /> <employee id = "1234D" role = "A" /> <employee id = "1234C" role = "X" /> <employee id = "1234B" role = "Z" /> <employee id = "1234X" role = "Z" /> ... </ roles>

Зовнішні дані в цьому прикладі є набором працівників з відповідними ролями. Перевіряється, що все ідентифікатори працівників в приходить XML існують в посилальному наборі даних. Для виконання даної операції потрібно скористатися функцією document () для завантаження зовнішніх XML даних в змінну. Перевірте, що хоча б один працівник з даними ідентифікатором імеетсяв змінної reference, щоб переконається в валідності цього ідентифікатора.

Лістинг 11. Валідація зовнішніх даних
<Xsl: variable name = "reference" select = "document ( 'reference.xml')" /> <xsl: template name = "validate"> <xsl: for-each select = "/ input: staff / input: employee "> <xsl: if test =" input: gender = 'M' and input: title! = 'Mr' or input: gender = 'F' and input: title = 'Mr' "> <xsl: value-of select = "exception: throwException (concat ( 'Gender and title do not match for employee', input: first_name, '', input: last_name))" /> </ xsl: if> <xsl: variable name = "current_id" select = "@ id" /> <xsl: if test = "count ($ reference / roles / employee [@id = $ current_id]) = 0"> <xsl: value-of select = "exception: throwException (concat ( ' Invalid employee ID: ', $ current_id)) "/> </ xsl: if> </ xsl: for-each> </ xsl: template>

висновок

На закінчення, Schematron є хорошим доповненням до XML Schema в разі, якщо вам необхідно проводити перевірку за кількома обмеженням, наприклад, застосовуючи XML як засіб підготовки звітів. У разі необхідності високої продуктивності і особливо, якщо після валідації необхідно використовувати перетворення, то XSLT з Java розширеннями є більш відповідним рішенням.

Ресурси для скачування

Схожі теми

Підпишіть мене на повідомлення до коментарів



Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью