Знакомство с уникальным парсером XML Object Link

Опубликовано mobilekid - пт, 21/12/2012 - 21:25

В последнее время довольно много писалось о том, что программист должен стре­миться досконально разбираться в тех программных средствах, кото­рые он использует. Однако недавно произошло нечто такое, что заставляет посмотреть на проблему использования программных средств шире. Произошло вот что: вышла на рынок крошечная по нынешним меркам утилита XML Object Link про­изводства известной фирмы RogueWave. По названию этой ути­литы можно судить о том, что она предназначена для работы с XML. Но то, что она делает, наверное, уникально. Во всяком случае, анало­гов этой утилиты в интернете отыскать не удалось.

То, как утилита работает, легко по­нять, произведя сравнение входных и выходных данных этой утилиты. По сути, всё программа очень простая, и о том, что «все гениальное просто», знает каждый. Однако же, по­пробуй додумайся до этой простоты! И что же такого особенного пред­лагает этот XOL (XML Object Link)? На этот вопрос смогут ответить не все, а только те, кому до XML Object Link (XOL) довелось поработать с другими парсерами XML. Остальные, наверное, лишь пожмут плечами и удивлен­но спросят: «Действительно, а что же тут особенного? Все просто, по­нятно, органично... А как можно иначе?» Если вы ответили на заданный выше вопрос точно так же, то не стоит читать эту статью. Но если на этот вопрос у вас нет ответа, давайте попробуем разобраться.

Ниже сравниваются прин­ципы работы «обычных» парсеров XML и XML Object Link. Вообще-то эти продукты относятся к совер­шенно различным классам задач, поэтому сравнение их как про­граммных продуктов, мягко говоря, некорректно. С другой стороны, с точки зрения прикладного про­граммиста они позволяют решать одни и те же задачи (хотя, разуме­ется, разными способами). Поэто­му, если рассматривать эти продукты именно в таком ракурсе, то сравнение будет вполне уместно.

В качестве образца для сравнения с XOL выбран MSxml - универ­сальный парсер фирмы Microsoft. Выбор этот обусловлен тем, что MSxml является, пожалуй, наиболее ши­роко распространенным на сего­дняшний день парсер. Как только программист приступа­ет к работе XML-документами, пе­ред ним встает вопрос о том, какие средства использовать для досту­па к данным, хранящимся внутри документа. В большинстве случаев выбор падает на XML-парсер, реа­лизующий т.н. DOM (Document Object Model). Эта модель предо­ставляет программистам возмож­ность работать с XML-документом как с набором объектов типов «Элемент», «Узел», «Атрибут» и так далее. Программной реализа­цией DOM является и msxml.dll, в которой реализованы библиотека типов и соответствующие СОМ-интерфейсы для доступа к данным.

Насколько можно судить, эта биб­лиотека полностью реализует спецификации DOM, предложенные консорциумом W3C. Сама по себе msxml.dll является очень мощным универсальным средством для работы с XML, и, ес­тественно, является достаточно сложной. В этом-то и заключается слабость ее и многих других про­дуктов, которые для своего освое­ния требуют хотя бы нескольких дней!

Сложившаяся в IT-индустрии ситуация зачастую препятствует серьезному освоению программи­стами средств разработки. Стрем­ление выдать программный про­дукт как можно раньше приводит к тому, что многие программисты переходят на «программирование мышкой», то есть использование всевозможных генераторов программ. Конечно же, это накладывает свой от­печаток и на стиль работы, когда программа пишется не в соответствии с требованиями, описанны­ми в технической документации, а в соответствии с tutorial-ами, позволяющими воспользоваться ка­ким-то малым подмножеством предоставляемых продуктом воз­можностей.

Как говорится, руки чешутся, тянутся к клавиатуре, а на прочтение документации вре­мени не остается.По­нятно, как ощущает себя про­граммист, которому поставили задачу сделать все, как говорится, к завтрашнему утру! Какая там документация, какое изучение... Ну, а если доба­вить что документация, которая входит в состав свободно распространяемого парсера MSxml, мягко говоря, написана далеко не иде­ально... Думаю, все понятно.

Таким образом, универсальность и мощность библиотеки определяет сложность ее освоения и приводит к большим затратам времени. Под­тверждением тому могут служить сообщения на любом форуме в ин­тернете, посвященном программи­рованию с XML. Универсальность любого парсера (подчеркиваю - любого, а не только MSxml) оборачивается еще одной неприятной для про­граммиста особенностью. Дело в том, что после того, как парсер освоен, для комфортной работы с данными в любом случае приходит­ся создавать собственный объект или структуры данных, в которые в дальнейшем можно будет записы­вать данные, взятые из документа XML. После этого программисту придется реализовывать многочис­ленные методы или функции для организации перекачки данных из CPP-шного объекта в документ XML (маршаллинг) и из документа XML в CPP-шный объект (анмаршаллинг). Любой програм­мист вспомнит бесконечный ряд методов типа getData() и setData(), которые ему пришлось писать. Эти методы, естественно, усложняют программу и повышают вероят­ность появления ошибок.

Резюмируя изложенное выше, можно сказать, что в случае разра­ботки программы, работающей с XML-документами и использующей обычный парсер, программист обя­зан не только изучить DOM и не только досконально разобраться с API, предоставляемым этим парсе­ром. Он должен реализовать соб­ственные объекты, соответствующие данным, и написать методы, реализующие маршаллинг и анмаршаллинг. На это уходит время, сопоставимое со временем разра­ботки основной программы. Други­ми словами, программист во вре­мя, отведенное для написания про­граммы, будет учиться, а не выда­вать продукцию. Ну, и небольшой нюанс - программист во время ра­боты над программой постоянно ощущает присутствие достаточно недружелюбного посредника - парсера XML. Во всяком случае, я не знаю ни одного человека, кото­рому общение с «обычным» парсе­ром доставило бы радость.

Что же такого необычного делает XML Object Link? Да ничего! Ничего в том смысле, что от тех недостат­ков, о которых мы говорили выше, не остается практически ничего. А фактически XOL выполняет за про­граммиста большую часть той ра­боты, о которой говорилось ранее. XML Object Link, получая в качестве ис­ходных данных только небольшой файл, содержащий схему XML-до­кумента, создает иерархию клас­сов C++, соответствующую описы­ваемой иерархии данных. При этом в состав каждого класса вхо­дят методы marshal() и unmarshal(), реализующие, соответст­венно, маршаллинг и анмаршаллинг. Кроме этого, для каждого элемента данных создаются мето­ды set () и get (), позволяющие записывать отдельные данные из срр’шного объекта в документ XML и, наоборот, из документа XML в CPP-шный объект. Все! Од­нако именно это приводит к карди­нальным изменениям в техноло­гии работы и восприятии задания программистом.

Программис­ту больше не нужно знать DOM и XML. Достаточно беглого знаком­ства с XML Schema. Программа XML Object Link производит настоящую «подмену понятий». Каким образом?, При разработке программы CPP-шные объекты перестают быть вторичными по отношению к доку­менту XML. Более того, с точки зрения разработчика документы XML вообще перестают существовать, так как они становится пол­ностью невидимыми для програм­миста. Другими словами, исчезает тот «посредник», о котором гово­рилось выше. Повышается уровень абстракции. Если раньше реаль­ные данные представлял доку­мент XML, а CPP-шные классы бы­ли лишь его отображением, то при использовании XOL классы напря­мую представляют реальные дан­ные. Есть только программа на C++, и ничего больше!

Кроме того, программис­ту не нужно больше разрабаты­вать собственные классы для хра­нения данных и собственные ин­терфейсы для доступа к данным в XML. Всю черновую работу делает XML Object Link. А в связи с тем, что объем кода, написанного программистом «вручную», значи­тельно уменьшается, то, соответ­ственно, уменьшается и вероят­ность появления ошибок. Следо­вательно, программы становятся более надежными.