Поскольку в MSXML работа с DOM базируется на спецификации СОМ, то для работы можно использовать любой язык программирования, поддерживающий СОМ: С++, Visual Basic, Delphi, Java, VBScript, JavaScript и т.д.
Работу с XML документом в MSXML условно разделим на три составляющие:
· действия по загрузке и сохранению XML документа. Данные действия не являются частью спецификации DOM и присуще только MSXML;
· обработка дерева XML документа с использованием объектов DOM, входящих в стандарт DOM;
· обработка дерева XML документа с использованием объектов DOM, специфичных для MSXML.
В данном документе рассматривается использование только первых двух составляющих.
Как отмечалось выше, действия по загрузке и сохранению XML документов выходят за рамки спецификации DOM. Поэтому описанные в данном разделе методы и свойства присуще только для анализатора MSXML.
Для того чтобы загрузить XML документ необходимо выполнить следующие действия:
· создать объект документа;
· выполнить метод, обеспечивающий загрузку документа;
· установить флаг синтаксического анализа;
· проверить правильность загрузки, т.е. сделать проверку на наличие ошибок, которые могли произойти при загрузке документа.
Рассмотрим каждое из этих действий.
Объект документ определяет корневой узел дерева. Он создается посредством стандартных действий в языках программирования по созданию нового экземпляра объекта.
Примеры создания объекта 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 описываются в разделе
Для загрузки документа 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
Для задания режима синтаксического анализа при загрузке XML документа используется свойство async, которое имеет формат:
xmlDoc.async
= <value>
где:
value – Boolean переменная, принимающая значения:
· 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
Для анализа возможных ошибок анализатора MSXML используется свойство parseError. Вызов данного свойства позволяет получить доступ к COM интерфейсу IXMLDOMParseError, который включает набор методов, позволяющих получить информацию о завершении процесса загрузки и анализа документа:
· errorCode – возвращает код ошибки;
· reason – возвращает строку с объяснением причин ошибки;
· line – возвращает номер строки в которой произошла ошибка;
· linePos – возвращает позицию строки в которой произошла ошибка;
· srcText – возвращает строковую переменную в которой содержится строка, в которой произошла ошибка;
· url – возвращает url, который указывает на загружаемый документ;
· filePos – возвращает позицию в файле, где найдена ошибка.
В данном разделе представлены примеры основных необходимых действий по загрузку 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>
Если в процессе работы с деревом XML документа были выполнены какие-либо его модификации, то результирующее дерево нужно сохранить. Для этой цели используется метод save. Он имеет следующий формат.
xmlDoc.save(<path>)
где:
path – путь доступа к XML документу. В качестве пути доступа может использоваться спецификация файла на диске, URL (Uniform Resource Locator), а также любые объекты, которые поддерживают IStream и объект IIS Request;