Покращена валідація XML
- пояснення
- Schematron
- Малюнок 1. Затвердження за допомогою Schematron
- Малюнок 2. Валідація за допомогою XSLT і Java розширення
- Лістинг 1. Що входить XML документ
- Лістинг 2. Приклад перетворення даних співробітника
- Лістинг 3. Вихідний документ
- Лістинг 4. Клас ValidationException
- Лістинг 6. Просте перетворення з декількома обмеженнями
- Лістинг 7. Детальний повідомлення про помилку
- Лістинг 8. Логіка перетворення
- Лістинг 10. Довідкові дані
- Лістинг 11. Валідація зовнішніх даних
- Ресурси для скачування
Валідація сукупності обмежень в XML документі, використовуючи XSLT і Java розширення
пояснення
Засновані на граматиці мови валідації, такі як XML схема і DTD, можуть гарантувати, що XML документи відповідають чітко структурованого повідомленням. Це забезпечує правильну обробку вхідних XML повідомлень отримують додатками, але не гарантує, що дані, що містяться в повідомленнях, є допустимими. Обмеження граматики мов валідації, означають, наприклад, що вам доведеться використовувати різні методи, щоб перевірити існуючі та встановити нові обмеження проти змінних і зовнішніх даних.
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 розширеннями є більш відповідним рішенням.
Ресурси для скачування
Схожі теми
Підпишіть мене на повідомлення до коментарів