2. РАБОТА С DOM В MSXML

 

Поскольку в MSXML работа с DOM базируется на спецификации СОМ, то для работы можно использовать любой язык программирования, поддерживающий СОМ: С++, Visual Basic, Delphi, Java, VBScript, JavaScript и т.д.

 

Работу с XML документом в MSXML условно разделим на три составляющие:

·       действия по загрузке и сохранению XML документа. Данные действия не являются частью спецификации DOM и присуще только MSXML;

·       обработка дерева XML документа с использованием объектов DOM, входящих в стандарт DOM;

·       обработка дерева XML документа с использованием объектов DOM, специфичных для MSXML.

В данном документе рассматривается использование только первых двух составляющих.

 

2.1. ДЕЙСТВИЯ ПО ЗАГРУЗКЕ И СОХРАНЕНИЮ XML ДОКУМЕНТА

Как отмечалось выше, действия по загрузке и сохранению XML документов выходят за рамки спецификации DOM. Поэтому описанные в данном разделе методы и свойства присуще только для анализатора MSXML.

 

2.1.1. Загрузка и сохранение XML документа

Для того чтобы загрузить XML документ необходимо выполнить следующие действия:

·       создать объект документа;

·       выполнить метод, обеспечивающий загрузку документа;

·       установить флаг синтаксического анализа;

·       проверить правильность загрузки, т.е. сделать проверку на наличие ошибок, которые могли произойти при загрузке документа.

Рассмотрим каждое из этих действий.

2.1.2. Создание объекта  документа

 

Объект документ определяет корневой узел дерева. Он создается посредством стандартных действий в языках программирования по созданию нового экземпляра объекта.

Примеры создания объекта XML документа с использованием различных языков представлены ниже:

а) VB (два альтернативных способа):

·       Dim xmldoc = new DOMDocument

·       Dim xmlDoc As MSXML.DOMDocument

     Set xmlDoc = New DOMDocument 

Примечание. Для работы с MSXML необходимо подключить его к проекту VB для чего в среде разработки выбрать Project/References и в появившемся списке отметить позицию Microsoft XML v3.0.

 

б) С++

    IXMLDOMDocumentPtr xmlDoc (("Microsoft.XMLDOM", NULL,

CLSCTX_INPROC_SERVER);

Примечание. В начале CPP файла или в заголовочном файле необходимо импортировать библиотеку msxml.dll следующим образом:

#include "msxml.dll"

using namespace MSXML;

 

с) JavaScript:

·       с использованием элемента ActiveX

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");

·       с помощью островка XML

<HTML>

<xml ID="island", SRC="library.xml"></xml>

<SCRIPT xmlDoc = island;

 

</SCRIPT>

</HTML>

 

д) VBScript:

     Dim xmlDoc

     Set xmlDoc = CreateObject("Microsoft.XMLDOM")

 

e) ASP

     <%

          dim xmlDoc

          set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")

         

    %>

 

Подробно методы и свойства объекта Document описываются в разделе

2.1.3. Выполнение метода, обеспечивающего загрузку документа

 

Для загрузки документа XML используется метод load.  Он имеет следующий формат (для VB):

boolValue = xmlDoc.load(<path>)

где:

path – путь доступа к XML документу. В качестве пути доступа может использоваться спецификация файла на диске, URL (Uniform Resource Locator), а также любые объекты, которые поддерживают IStream и объект IIS Request;

boolValue – boolean переменная. Принимает значение true, если документ загрузился успешно. В противном случае – false.

Пример загрузки XML документа с именем library.xml, который находится на локальном диске D: в каталоге XML.

 

If xmlDoc.load(d:\xml\library.xml) = true Then

      MsgBox "Документ успешно загружен"

Else

      MsgBox "Ошибка при загрузке документа"

End If

2.1.4. Установка флага синтаксического анализа

 

Для задания режима синтаксического анализа при загрузке XML документа используется свойство async, которое имеет формат:

xmlDoc.async = <value>

где:

valueBoolean переменная, принимающая значения:

·       false – для задания синхронного режима анализа;

·       true – для задания асинхронного режима анализа.

При синхронном режиме анализатор не вернет управление до тех пор, пока не загрузит документ и не завершит его анализ.

 

Пример задания синхронного режима (для VB):

xmdDoc.async = false

 

В случае задания асинхронного режима, параллельно с анализом документа можно выполнять какие-либо другие действия. Для определения завершения анализа используется свойство readystate. Данное свойство в процессе загрузки и анализа принимает следующие значения:

1 – выполняется загрузка документа;

2 – загрузка завершилась, выполняется анализ;

3 – анализ завершен, но объекты доступны только в режиме чтения;

4 – анализ полностью закончен.

Полностью можно быть уверенным, что загрузка и анализ XML документа в асинхронном режиме завершились (успешно или неуспешно) только когда readystate принимает значение равное 4.

 

Для того чтобы в программе отследить событие завершения загрузки в асинхронном режиме используется свойство onreadystatechange. Данное свойство позволяет задать функцию обработки события изменения значения свойства readystate.

 

Пример определения полного завершения загрузки и обработки документа в асинхронном режиме. В примере асинхронный режим задан явно, но его можно и не указывать, т.к. это значение устанавливается по умолчанию.

 

xmlDoc.async = True           

xmlDoc.onreadystatechange = CheckState

 

Function CheckState()

    Dim state As Integer

    If (xmlDoc.readyState = 4) Then

        MsgBox "Загрузка и анализ документа завершены"

        'Здесь можно проверить правильность загрузки (см. раздел 2.1.5)   

    End If

End Function

2.1.5. Проверка правильности загрузки

Для анализа возможных ошибок анализатора MSXML используется свойство parseError. Вызов  данного свойства позволяет получить доступ к COM интерфейсу IXMLDOMParseError, который включает набор методов, позволяющих получить информацию о завершении процесса загрузки и анализа документа:

·       errorCode – возвращает код ошибки;

·       reason – возвращает строку с объяснением причин ошибки;

·       line – возвращает номер строки в которой произошла ошибка;

·       linePos – возвращает позицию строки в которой произошла ошибка;

·       srcText – возвращает строковую переменную в которой содержится строка, в которой произошла ошибка;

·       url – возвращает url, который указывает на загружаемый документ;

·       filePos – возвращает позицию в файле, где найдена ошибка.

 

2.1.6. Примеры загрузки XML документа

В данном разделе представлены примеры основных необходимых действий по загрузку XML документов на языках VB, C++, JavaScript и VBScript.

 

2.1.6.1. Пример на VB представлен ниже на примере процедуры LoadXML.

 

Private Sub LoadXML()

    Dim xmlDoc As MSXML.DOMDocument

    Set xmlDoc = New DOMDocument    'создаем экземпляр объекта документа

    xmlDoc.async = False            'устанавливаем синхронный режим загрузки

    xmlDoc.validateOnParse = False 'определяем документ как правильный

       '(well-formed), т.е. без DTD

    On Error GoTo ErrMes          'устанавливаем адрес обработчика ошибок

    xmlDoc.Load "d:\library.xml"  'загружаем XML документ

    'анализируем завершение процесса загрузки

    If xmlDoc.parseError.errorCode = 0 Then

        MsgBox "Загрузка и анализ XML документа завершились успешно"

    Else

        'в случае ошибки, которую определил анализатор,

        'выдаем полную информацию о ней

        MsgBox xmlDoc.parseError.errorCode _

        & vbCrLf & xmlDoc.parseError.reason _

        & vbCrLf & xmlDoc.parseError.Line _

        & vbCrLf & xmlDoc.parseError.linepos _

        & vbCrLf & xmlDoc.parseError.srcText _

        & vbCrLf & xmlDoc.parseError.url _

        & vbCrLf & xmlDoc.parseError.filepos

    End If

    Exit Sub

ErrMes:

        MsgBox "Файл не найден или не может быть открыт"

End Sub

 

2.1.6.2. Пример на С++

 

#import "msxml"

using namespace MSXML

IXMLDOMDocumentPtr pxmlDoc ("Microsoft.XMLDOM",  NULL, CLSCTX_INPROC_SERVER);

 

xmlDoc->async = false;    //асинхронный режим загрузки

pxmlDoc->load ("d:\library.xml");   //загружаем XML документ

//настраиваемся на объект parseError и проверяем выполнение загрузки

IXMLDOMParseErrorPtr  pErr = pxmlDoc->parseError; 

if( pErr->errorCode != 0)

    {AfxMessageBox (pErr->reason);

      return;

    }

else

   AfxMessageBox ("Загрузка XML документа завершились успешно");

 

2.1.6.3. Пример на JavaScript

а) с использование ActiveX

 

<HTML>

<SCRIPT language="JavaScript">

 

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("d:\library.xml")

//проверяем коррекность загрузки

          if(xmlDoc.parseError.errorCode != 0)

          {

             //сообщение об ошибке

                    alert(xmlDoc.parseError.reason);

                    alert(xmlDoc.parseError.line);

          }

          else

          {

                    alert("XML загружен успешно");

          }

</ SCRIPT>

<HTML>

 

б) с использование XML островка

 

<HTML>

<xml ID="island", SRC="d:\library.xml">

</xml>

<SCRIPT language="JavaScript">

//создаем объект документа XML

          var xmlDoc=island;

//проверяем коррекность загрузки

          if(xmlDoc.parseError.errorCode != 0)

          {

             //сообщение об ошибке

                    alert(xmlDoc.parseError.reason);

                    alert(xmlDoc.parseError.line);

          }

          else

          {

                    alert("XML загружен успешно");

          }

</SCRIPT>

</HTML>

2.1.7. Сохранение документа

Если в процессе работы с деревом XML документа были выполнены какие-либо его модификации, то результирующее дерево нужно сохранить. Для этой цели используется метод save. Он имеет следующий формат.

xmlDoc.save(<path>)

где:

path – путь доступа к XML документу. В качестве пути доступа может использоваться спецификация файла на диске, URL (Uniform Resource Locator), а также любые объекты, которые поддерживают IStream и объект IIS Request;

 

Используются технологии uCoz