В предыдущей статье мы проверяли орфографию с помощью веб сервиса от Яндекса. Сегодня мы создадим еще одну обработку с проверкой орфографии, но усложним задачу, если почитать документацию по яндекс спеллер API можно узнать, что проверка текста возможна на 3 языках:
Также можно управлять параметрами проверки: таблицу берм из описания API спеллера. Это кстати неправильно по WSDL мы должны получить полное описание сервиса, а тут есть параметр, который вычислить без чтения документации невозможно, но главное что документация есть.
Значение (десятичное) |
Описание (пример) |
1 |
Пропускать слова, написанные заглавными буквами, например, "ВПК". |
2 |
Пропускать слова с цифрами, например, "авп17х4534". |
4 |
Пропускать интернет-адреса, почтовые адреса и имена файлов. |
8 |
Подсвечивать повторы слов, идущие подряд. Например, "я полетел на на Кипр". |
16 |
Пропускать слова, написанные латиницей, например, "madrid". |
32 |
Только проверять текст, не выдавая вариантов для замены. |
128 |
Отмечать слова, написанные латиницей, как ошибочные. |
256 |
Не использовать словарное окружение (контекст) при проверке. Опция полезна в случаях, когда на вход сервиса передается список отдельных слов. |
512 |
Игнорировать неверное употребление ПРОПИСНЫХ/строчных букв, например, в слове "москва". |
Для того чтобы использовать несколько параметров их значение просто надо сложить вместе. Ну и указание формата проверяемого текста : plain - текст без разметки (значение по умолчанию) или html - HTML-текст.
Для установки параметров добавим к нашей предыдущей обработке дополнительную форму с незатейливым название «Настройки» Выглядеть она будет так:
Немного изменим код обработки. Теперь нам нужно передать не просто текст в веб сервис, а структуру с несколькими параметрами, для этого нам нужно получить описание параметра веб сервиса.
Сначала смотрим, что мы должны передать веб сервису:
Операции checkTexts мы должны передать параметр с типом CheckTextRequest, который состоит из атрибутов: lang, options, format, text.
Код, который осуществляет это следующий:
WSОпределение = Новый WSОпределения("http://speller.yandex.net/services/spellservice?WSDL","", ""); WSПрокси = Новый WSПрокси(WSОпределение, "http://speller.yandex.net/services/spellservice" , "SpellService", "SpellServiceSoap12" ); // Получаем описание параметра веб сервиса ТипWSПараметра = WSПрокси.ФабрикаXDTO.Пакеты.Получить("http://speller.yandex.net/services/spellservice").Получить("CheckTextRequest"); //Создаем параметр на основе типа и заполняем значение параметра WSПараметр = WSПрокси.ФабрикаXDTO.Создать(ТипWSПараметра); WSПараметр.lang = ЯзыкиПроверки; WSПараметр.options = Параметры; WSПараметр.format = ТипТекста; WSПараметр.text =текст; РезультатВебОперации = WSПрокси.checkTexts(WSПараметр);
Заметьте, для облегчения понимания работы с веб сервисом я использовал Wsссылку из структуры метаданных конфигурации, но работаем мы с динамической ссылкой.
Параметры передали, теперь можно обрабатывать результат, в предыдущем примере мы это сделали без проблем, запускаем обработку и … у нас выскакивает ошибка, почему? У нас немного не тот формат результата, который возвращается у операции checkText формат результата SpellResult (http://speller.yandex.net/services/spellservice) а у операции checkTexts формат другой CheckTextsResponse (http://speller.yandex.net/services/spellservice),
который состоит уже из SpellResult – ов. Посмотрим, как выглядит ответ сервера в XML формате, воспользовавшись soapUI.
Модифицированный код разбора результата будет такой
для каждого строки1 из РезультатВебОперации.ArrayOfSpellResult.SpellResult цикл для каждого строки из строки1.error цикл стр0= ВариантыНаписания.Добавить(); стр0.слово= строки.word; стр0.Позиция = строки.pos; для каждого вариантыЗамены из строки.s цикл стр=слова.добавить(); стр.слово=строки.word ; стр.ВариантНаписания= вариантыЗамены; стр.строка = строки.row; стр.Позиция = строки.pos; конеццикла; конеццикла; конеццикла;
как видите, мы просто спустились по структуре ХМЛ до уровня, на котором уже есть нужные нам данные.
Пример обработки доступен по ссылке: http://goo.gl/JZ9Ag