|
||||||||||||||
|
||||||||||||||
|
Новости |
Почему XML?
Вы могли бы удивиться: "А для чего нужен XML, если он является всего лишь разновидностью, а точнее производной от SGML?". Вероятно, это правильный вопрос, и мне бы хотелось сразу на него ответить. Не секрет, что XML-это производный от SGML язык, но SGML-язык, использующий огромное множество различных элементов, которые затрудняют и усложняют работу при создании Web-документов (именно поэтому на ранних этапах развития Web, из-за своей сложности в освоении, SGML был заменен более простым HTML, который стал базовым для бурно развивающейся Web. XML — гораздо более проще, чем SGML, но при этом он предоставляет ни чуть не меньше возможностей разработчикам.
Нужно сказать, что XML полезен для автоматизированных программных средств, ищущих в Web. Несовершенство HTML привело к тому, что сеть превратилась в мешанину текста, полную различных элементов и тэгов, часто используемых, что называется Pro Forma и ничего не значащих.
XML обладает огромным потенциалом для усовершенствования гипертекста. Например в HTML для создания связи использется элемент A, XML же позволяет создать не просто ссылку, а к примеру, двунаправленную связь.
Таблицы стилей, используемые с XML могут быть, в конце-концов, определены как Семантика стиля документа и язык спецификации, то есть как международный стандарт для StyleSheet программирования. Результат будет следующий: мы получим более значимую, осознанную и красивую Web-сеть.
Кто использует XML?
XML до сих пор используется немногими, потому что язык все еще находится в стадии разработки. Существует несколько демонстрационных браузеров для просмотра XML-документов и примеры самих документов.
Перспектива XML заключается в том, что он будет использоваться для описания других языков разметки, например, JavaScript, используемого в HTML-документах. Также XML, вероятно, будет весьма полезен для промышленности, которая создавая свои DTD, смогут создавать документы соответствующие области или отрасли промышленности и отражать ее специфические черты.
KINOSALO Сайт kinosalo.org: любительское порно. |
seo & website usability | inet | os faq | hardware faq | memory | video | cpu | hdd | mainboard faq | printer & scaner | modem | mobiles | hackzone |
На главную | Cookie policy | Sitemap
С помощью этой статьи, вы быстро погрузитесь в XML. Я буду брать предметы из повседневной жизни, и пытаться описывать их, используя XML. Затем я загружу файл XML в объектную модель документов XML. После этого я продемонстрирую, как запрашивать XML документы с помощью XPath и проделывать некоторые основные манипуляции над ними. Все эти действия будут продемонстрированы с использованием простого приложения на Visual Basic и Microsoft Parser версии 3.0. Заключительной целью этой статьи будет разработка элемента управления ActiveX , который будет запрашивать данные из базы данных pubs на SQL Server и возвращать список наименований книг в формате XML.
Если кто-либо из вас когда-нибудь пытался изучить XML своими силами, Вы возможно встречались со многими сбивающими с толку понятиями, обрушившимися и на меня в свое время. DTD, XML Schema, пространства имен (namespaces), XPath, XPointers, XSL, XSLT, DOM, SAX, SOAP, Все, я сдаюсь. Добавлю лишь, что большинство из этих материалов основано на реализациях, код которых может содержать ошибки. Наверняка существуют миллионы способов реализации и использования XML, но они все могут быть достаточно сложны. А знаете, XML может быть и очень простым. Если мы забудем про DTD, XML Schemas, пространства имен (namespaces), и т.п. Стараясь быстрее обучить вас работе с XML, я буду по возможности игнорировать приличную долю информации, которую вы и так сможете прочитать в соответствующей литературе. И первое что я собираюсь проигнорировать, это пространства имен (namespaces) и схемы (schemas). Вам это может показаться странным, так как большинство книг начинаются именно с объяснения этих понятий, но постарайтесь думать об XML как о средстве решить конкретную задачу, как, например, о молотке. Для того чтобы пользоваться молотком, разве обязательно знать, как построить дом? Что если все что мне нужно, это просто вбить гвоздь чтобы повесить на него картину? То же самое и с XML, он может быть и очень сложным, достаточно универсальным для использования в сотнях, если не в тысячах приложений, и очень простым, если не обращать внимания на некоторые вещи. В этой статье, я буду концентрироваться на решении конкретных проблем с помощью XML. Так в чем же собственно проблема? Давайте предположим, что я хочу описать простой объект, например стакан, используя XML. Зачем я собираюсь использовать XML для этого? Ну, во-первых, это как раз то, для чего и предназначен XML. XML описывает данные. В моем примере, стакан, это и есть данные. В жизни, данными могут быть документы Word, листы электронных таблиц, изображения, книга, запись базы данных, или даже классы C++ или Visual Basic. Во вторых, XML расширяем. XML позволяет мне создавать столько признаков, сколько необходимо для описания данных и эти признаки будут такими, какими я захочу. И, наконец, потому что XML быстро становится стандартом. Если на Марсе есть жизнь, то можете не сомневаться, что они там смогут понять мой XML файл. Какие основные свойства позволяют описать стакан?
Как бы то же самое выглядело в формате XML?
Заметьте, что первая строка файла (?xml version="1.0"?) имеет специальный вид, пока, просто запомните, что она должна быть тут. Прелесть формата XML в том, что любой может понять, о чем в нем говориться, просто внимательней взглянув на него. Понятно также, что это не единственное из возможных XML описаний стакана. Если я попрошу 10 человек разработать XML описание стакана с одинаковыми свойствами, возможно, все они создадут разные, но верные описания. Вот тут как раз и кроется проблема. Возможно не для нас, людей, но когда компьютер читает XML файл, то было бы отличной идеей, дать ему знать, о чем этот файл. Вот тут и всплывает пространство имен (namespaces) и схемы (schemes). Проще говоря, схемы используются для определения адекватной структуры для XML файла. Теперь настало время поговорить о нескольких простых правилах XML, которым необходимо придерживаться: Правило XML #1: Адекватный XML файл должен в точности соответствовать своей схеме. Но для простоты понимания материала, ни один из моих примеров не будет использовать схемы. Таким образом, строго говоря, ни один из моих примеров не "адекватный". Но, честно говоря, мне все равно. Я не собираюсь строить дом, мне нужно всего лишь повесить картину. Я подробней расскажу об этом позже, когда будем обсуждать объектную модель документов XML. Правило XML #2: Если вы программируете на VB, запомните: XML чувствителен к регистру. XML чувствителен к регистру. XML чувствителен к регистру. XML чувствителен к регистру. Напишите это предложение 1000 раз и никогда не забудете. Правило XML #3: Тэги принято называть элементами и каждый открывающийся тэг, должен иметь соответствующий ему закрывающийся тэг. Следуя этому правилу, у вас получится правильный XML файл. Это очень важно, потому что до тех пор, пока XML файл не будет правильно оформлен, он не будет проанализирован и не загрузится в объектную модель документов. Заметьте, если элемент не содержит значений и не содержит других (вложенных) элементов, закрывающий тэг может иметь вид <Element /> вместо более громоздкой конструкции <Element></Element>. Можете увидеть такой подход в предыдущем примере (<OTHER qty="0"/>). Правило XML #4: Элементы могут содержать атрибуты, а значения атрибутов должны быть заключены в кавычки (одинарные или двойные). Правило XML #5: Можно несколько раз использовать имена атрибутов, но имена элементов должны быть уникальны для всего файла. В предыдущем примере, атрибут qty имел различное значение в зависимости от того, в каком элементе он используется <SOLID>,<LIQUID>, или <OTHER>. Значение атрибута зависит от контекста его использования. Тогда как значение элемента всегда означает одно и то же, независимо от того, в каком месте файла атрибут находится. В предыдущем примере, элемент <SOLID> и <HEIGHT> всегда имеет одно и то же значение во всем нашем документе. <HEIGHT> например, всегда используется для описания высоты стакана. Правило XML #6: В XML есть несколько специальных символов, которые не могут быть использованы напрямую, потому что являются зарезервированными в синтаксисе XML. Поэтому, для использования таких символов, придется использовать зарезервированную конструкцию, начинающуюся с символа & и специального кода, (символ & должен писаться как &) (символ " должен писаться как ") (символ < должен писаться как <) (символ> должен писаться как >) и (символ ' должен писаться как '). Вместо этого, также можно использовать инструкцию <![[CDATA[...]]>, где на месте "...." может быть любая последовательность символов, кроме "]]>". Такая конструкция может встречаться в любом месте, но она не может быть вложенной. 2. Объектная модель документов XML Объектная модель документов XML позволяет программистам загружать содержимое XML файла в память. Как только XML файл загружен таким образом, с ним можно работать, используя свойства, методы и события объектной модели документов. Вот где как раз и проявляется польза XML. Объектная модель документов значительно облегчает выборку и обработку информации XML файла. Я не буду тут рассказывать обо всех возможностях объектной модели документов, расскажу лишь о некоторых основных возможностях, которые помогут в достижении цели этой статьи. Я возьму только что созданный XML файл с описанием стакана, загружу его в объектную модель документов и проделаю несколько действий с ним. Остальные особенности и возможности объектной модели документов я приберегу для следующей статьи, рассказывающей о клиентском XML. Заметьте, не смотря на то, что объектная модель документов очень хороша и удобна для разработчиков, она требует довольно значительного объема системных ресурсов. Поэтому существует еще один метод анализа XML файлов, известный как SAX. Моя статья не претендует на исчерпывающий источник информации по этому вопросу, поэтому было бы полезно также воспользоваться XML SDK. Давайте посмотрим на пример, используя анализатор Microsoft's XML версии 3.0 (Microsoft's XML parser version 3.0 (msxml3.dll)) чтобы разобраться, как же это все работает. Если у вас нет анализатора, то последнюю версию можно скачать с сайта Microsoft. Предположим, я сохранил пример описания стакана в формате XML в файл "" (локальный путь C:\inetpub\wwwroot\xml\cup.xml) и теперь хочу загрузить его в объектную модель документов. Следующий код предполагает, что анализатор уже загружен и работает.
Пояснение приведённого кода - пройдемся по коду на VB6 Строка 1:Dim xmlDoc as MSXML2.DOMDocument30 В этой первой строке определяем ссылку на "Microsoft XML, v3.0". В этой строке я определил переменную xmlDoc как ссылку на XML документ. MSXML2 это библиотека (используйте это название, не пытайтесь написать MSXML3, это не будет работать). DOMDocument30 определяет объект XML документа соответствующий версии 3.0. Вы также можете встретить такой код: dim xmlDoc as MSXML2.DOMDocument. Такой конструкцией обычно пользуются, когда не хотят указывать конкретную версию XML документа. В этом случае будет использоваться зарегистрированный по умолчанию в системе анализатор. Проблема может быть только в том, что версия анализатора, зарегистрированная по умолчанию, может отличаться на разных компьютерах. Если вы хотите быть уверенными в том, что написанный вами код будет работать с любой версией анализатора, то не используйте в нем специфических для конкретных версий анализатора конструкций. Потому, что нет никакой гарантии, что у пользователя, который будет пользоваться вашим кодом, установлена имена та версия анализатора, под которую вы писали свой код. Еще одно преимущество разработки кода, независимого от версии анализатора в том, что когда выходит более новая версия анализатора, у нее обязательно будет обратная совместимость с предыдущими версиями, и вам не придется перекомпилировать ваш код. Строка 2:Set xmlDoc = new DOMDocument30 В этой строке происходит инициализация переменной xmlDoc как нового экземпляра объекта XML документа версии 3.0. Строка 3:xmlDoc.async = False Файлы XML могут быть загружены либо в синхронном, либо в асинхронном режиме. Если xmlDoc.async = False, то значит, что содержимое XML фала будет загружено, и только после этого управление будет передано вызывающему процессу. Если xmlDoc.async = True, то значит, что управление будет передано вызывающему процессу сразу, не дожидаясь, пока содержимое XML файла будет полностью загружено. Строка 4:xmlDoc.validateOnParse = False Этот код сообщает о том, что анализатор не должен проверять загружаемый XML файл на соответствие своей схеме (validateOnParse = False). Для того, чтобы включить проверку на соответствие схемы, нужно написать validateOnParse = True. Строка 5:xmlDoc.load ("C:\inetpub\wwwroot\xml\cup.xml") В этой строке вызывается метод загрузки указанного XML файла. Существует два вида метода загрузки. Первый, который написан в строке 5, загружает файл в объектную модель документов, и при этом нужно обязательно передавать полный путь до XML файла. Второй вариант загрузки предусматривает передачу в качестве параметра xml строку. Такой вид загрузки мог бы быть вызван, например, так: xmlDoc.loadXML("корректная xml строка"). Я покажу, как пользоваться этим способом позже. Строка 6:MsgBox xmlDoc.xml Эта строка отображает содержимое загруженного XML файла. В результате мы должны получить тот исходный XML файл, который создали ранее. 2.2. Исследование объектной модели документов XML Создайте в Visual Basic новый проект и назовите его standard.exe. Вставьте приведенный выше код в метод загрузки главного окна вашего проекта. Убедитесь, что вы объявили ссылку именно на "Microsoft XML v3.0". Для того, чтобы это сделать, нажмите Project-->References, затем пролистайте появившийся список вниз и найдите в нем нужную ссылку. Заметьте, анализатор версии 3.0 должен быть установлен на вашем компьютере, иначе в списке его не будет. Установите точки остановки на последней строке кода (msgbox xmlDoc.xml). Запустите приложение в режиме отладки. Когда процесс выполнения дойдет до точки остановки, вызовите окно "Locals" и посмотрите объектную модель документов. Можно многое узнать, просматривая то, что отображено в этом окне. Окно "Locals" должно быть похоже на то, что изображено на рисунке ниже. Вот некоторые интересные свойства объектной модели документов. Объектная модель документов XML всегда содержит два узла верхнего уровня:
nodeName или baseName - могут быть использованы при поиске имени элемента или атрибута. nodeType - используйте для того, чтобы получить тип текущего узла. nodeValue - используете для того, чтобы узнать значение данных узла. childNodes - это коллекция узлов-потомков. Они могут быть узлами элементов, текстовыми узлами и узлами CDATA. Могут быть и другие типы узлов, про которые я сейчас рассказывать не стану, но вы сможете узнать все про них в XML SDK. attributes - это коллекция узлов атрибутов текущего элемента. length - используется для определения количества узлов в дереве непосредственно принадлежащих текущему. xml - это свойство присутствует во всех узлах и может быть использовано для представления текущей позиции в документе. XML строка начинается с текущего узла и проходит вниз до конца дерева. Это очень полезное свойство. Поэкспериментируете с ним и увидите, что получится. Узел элементов может содержать узлы потомки элементов, атрибутов, текста или CDATA. Из рисунка ниже видна следующая информация об узле "SOLID": nodeType - Тип текущего узла = NODE_ELEMENT - т.е. текущий узел является элементом. nodeName или baseName или tagName - Название текущего узла (элемента) = SOLID. Его родительский элемент CONTENTS имеет 4 потомков. Это можно увидеть на следующем рисунке, но SOLID имеет одного потомка, который имеет текстовый тип данных. text - "ice cube" это сокращенный метод, позволяющий получить значение текущего узла без перемещения к текстовому узлу потомка. Узлы атрибутов могут состоять только из текстовых или CDATA узлов-потомков. На следующем рисунке показано, какая информация может быть получена об узле "qty": nodeType - Тип текущего узла = NODE_ATTRIBUTE - текущий узел является атрибутом. nodeName или baseName - Имя текущего узла (Атрибутов) = qty Из следующего рисунка также понятно, что qty имеет одного потомка, который имеет текстовый тип данных. text или value - "2" это сокращенный метод, позволяющий получить значение текущего узла без перемещения к текстовому узлу потомка. 2.2.4. Текстовые узлы и узлы CDATA Текстовые или CDATA узлы не содержат потомков. Текстовые узлы содержат обработанные текстовые данные своего родительского узла. CDATA содержат необработанные текстовые данные своего родительского узла. CDATA узлы создаются, когда данные в XML файле специальным образом обрамлены. Метка CDATA говорит анализатору не разбирать данные и принимать символы внутри этой метки как данные. Секция CDATA особенно полезна, когда нужно вставить код внутрь XML файла. На следующем рисунке показано, какая информация может быть получена из текущего текстового узла: nodeType - Тип текущего узла = NODE_TEXT - текущий узел содержит текстовые данные. nodeName - Имя текущего узла (текстового) = #text - все текстовые узлы называются #text data или text или value - "2" - это текущие данные узла. 2.2.5. Ошибки при загрузке документа Секция parseError объектной модели документов может оказаться полезно при выявлении проблем, возникающих при загрузке XML документа. Если я удалю закрывающий тег от OTHER в файле нашего примера и попытаюсь запустить программу еще раз, то получу следующий результат. Первая часть полезной информации, это то, что наш nextSibling теперь содержит значение Nothing. Теперь, если вы посмотрите на childNodes, вы можете увидеть, что поле length теперь равно 0. Оба этих признака говорят о том, что наш XML документ не был загружен. Чтобы разобраться почему, я открываю узел parseError и получаю всю информацию об ошибках. Итак, я показал вам, как загрузить XML файл в объектную модель документов, но что с ним там делать? Одна из основных возможностей, которой вы сможете пользоваться это выполнять различные запросы к XML документу. Для этого вы конечно можете просматривать весь документ до тех пор, пока не найдете информацию которую ищите. Но наиболее предпочтительный способ, это использование одного из двух методов класса DOMDocument. Два метода используемые для поиска узлов в нашем предыдущем примере могли бы выглядеть как xmlDoc.SelectSingleNode(patternString) - для получения искомого узла, или xmlDoc.SelectNodes(patternString) - для получения списка искомых узлов. Параметр patternString как раз и является запросом. Он может быть сформирован одним из двух способов. Либо как XSL запрос, либо как XPath запрос. Более новый и предпочтительный способ создавать запросы к XML документу, это XPath. Формат patternString должен быть установлен заранее, перед первым вызовом любого из двух методов запроса данных, иначе по умолчанию будет использоваться XSL способ формирования запросов. Для установки типа формирования patternString используйте setProperty("SelectionLanguage", "format"). Для того, чтобы изменить запросы в нашем примере таким образом, чтобы использовался способ XPath, я добавлю следующую команду: setProperty("SelectionLanguage","XPath"). По-моему, XPath это самая важная технология в XML которую следует изучить. Я приведу несколько простых XPath запросов. Хорошим началом для изучения этой технологии может служить Microsoft XML SDK. Еще одним способом для объяснения этого, могло бы быть написание простого приложения на Visual Basic, которое позволяет вводить запросы и выводить результат. Вы, возможно, найдете какие-нибудь бесплатные приложения, которые делают то же самое, но XPath довольно новый и может не вполне поддерживаться этими приложениями. 2.3.1. Использование XPATH для выполнения запросов к объектной модели документов Давайте добавим некоторый код в конец нашего предыдущего примера для того, чтобы возвратить содержимое нашего стакана:
Запустите программу и посмотрите, что получится. Вы должны получить четыре сообщения, в которых говориться о содержимом стакана. Последнее сообщение должно быть пустым, потому, что элемент "OTHER" не содержит никакого текста. Давайте составим запрос, который возвращает все содержимое стакана, где qty>0. следующая строка кода делает именно это:
ОТЛИЧНО! Давайте теперь добавим еще один запрос, который позволит нам определить, есть ли у стакана крышка или нет. Добавьте следующий код в конец предыдущего:
Пройдемся по коду строка за строкой: Строка 1: Dim objNode As IXMLDOMNode В этой строке определяется переменная objNode типа узел XML документа. Важно понимать, что узел XML документа это тоже объект. Это не значение. Он состоит сам из себя, также как и его атрибуты и потомку (childNodes). Этим способом вы можете отсекать ненужные ветви дерева, выбирая только нужные. Строка 2: Dim objListOfNodes As IXMLDOMNodeList В этой строке определяется переменная objListOfNodes имеющая тип списка узлов XML документа (группы узлов). Строка 3: xmlDoc.setProperty "SelectionLanguage", "XPath" Эта строка устанавливает способ формирования patternString как XPath. Строка 4: MsgBox "Your cup contains the following items:" Строка 5: Set objListOfNodes = xmlDoc.selectNodes("//CONTENTS/*[@qty>0]") Эта строка выполняет XPath запрос, который вернет группу узлов и сохранит их в переменной objListOfNodes. Запрос разбит на следующие части:
Строка 6-8: For Each objNode In objListOfNodes / MsgBox objNode.Text / Next Эти строки отображают значения каждого узла элемента, которые соответствуют запросу. ("ice cube" , "straw" , "water"). Строка 9: Set objNode = xmlDoc.selectSingleNode("/CUP/LID") Эта строка возвращает все элементы LID, которые принадлежат элементу CUP, который, в свою очередь, порожден от корня дерева (когда запрос начинается с /, то это означает что начинать нужно с корня). Это очень похоже на путь к файлу или папке. В нашем примере, этот запрос вернет элемент LID, который содержит значение "yes". Важно тут то, что я указал запросу начинать с корневого элемента XML документа. Запросы не всегда начинают выполняться с корневых элементов, обычно они начинаются с текущего узла. В нашем примере это не имеет значения, поскольку текущим узлом (xmlDoc) и является корневой элемент XML документа (но не во всех случаях это так). Строка 10-15: if objNode.text="yes" then / MsgBox "We have a lid" / else / MsgBox "No lid on this cup" /end if Эта строка отображает сообщение "We have a lid" потому, что текстовое свойство элемента LID "yes". Теперь, когда вы поняли основы XML, давайте создадим элемент управления ActiveX, который будет конвертировать набор данных ADO в XML формат. Цель в том, чтобы получить наименования книг из таблицы Titles базы данных Pubs и вернуть их в формате XML. Результат, который получится я буду использовать в своей следующей статье. Вы можете сказать, ADO имеет свои собственные методы для сохранения результата в формате XML, правильно? Да, но если доверить это ADO, то в итоге я получу XML файл в таком ужасном формате, что с ним невозможно будет работать. ADO создаст XML файл с использованием пространства имен, а мне сейчас это совсем не нужно. Во-вторых, ADO создаст XML файл, который будет представлен в форме атрибутов. Иными словами, каждая запись станет элементом и каждое поле - атрибутом:
А мне бы хотелось получить XML файл в форме элементов, где каждая запись, содержалась бы в теге <BOOK>, и каждое поле было бы элементом внутри тега <BOOK>. Синтаксис моей XML строки был бы таким:
Кстати, то, что я только что сделал, это создал схему для моей XML строки. Теперь, если мне нужно сверить структуру XML документа со схемой, все что мне останется сделать, это преобразовать схему в правильный формат. То есть в синтаксис DTD или XDR. Заметьте, что я добавил некоторые атрибуты к каждому элементу <FIELD>. Одна из причин этого в том, что эта информация может быть использована клиентом. Prettyname могут быть использованы как метки данных. Атрибут datatype мог бы быть использован для проверки данных на стороне клиента. Но чтобы быть честным, истина причина того, что появились эти атрибуты в том, что они имеют особое назначение в шаблоне XSL фала, который я часто использую для построения секции where SQL запросов. Может быть, я скоро опубликую статью, демонстрирующую этот подход. Шаблон на самом деле очень полезный. Когда XML структура применяется к данным из таблицы Titles, результат будет выглядеть следующим образом:
Теперь я получил что-то, с чем можно работать! Листинг 1 - CUP.XML
Листинг 2 - Загрузка Cup.xml в объектную модель документов
Листинг 3 - Элемент управления ActiveX: ADO в XML (WebClass.dll)(xmlControl.cls)
Листинг 4 - Тестовое приложение на VB для проверки WebClass
Листинг 5 - ASP для тестирования WebClass
|