Браузер Internet Explorer, начиная c версии 5.0 поддерживает XML и XSLT. Задача: разобрать реализацию XML в IE и научиться с ней работать.
Реализация XML появилась в IE начиная с пятой версии в виде ActiveX-компоненты на базе
библиотеки MSXML. Существует несколько версий этой библиотеки, каждая из которых полнее предыдущей. Для того, что определить какую реализацию MSXML поддерживает ваша версия IE и создать объект для работы с XML, воспользуемся следующей функцией:
• Код JavaScript
function createXMLObject() {
var versions = [
"Msxml2.DOMDocument.6.0",
"Msxml2.DOMDocument.5.0",
"Msxml2.DOMDocument.4.0",
"Msxml2.DOMDocument.3.0",
"Msxml.DOMDocument",
];
for (var i = 0; i < versions.length; i++) {
try {
var ieXML = new ActiveXObject(versions[i]);
return ieXML;
} catch(e) {}
}
alert("MSXML not supported");
return false;
}
var ieXMLObject = createXMLObject();
Если функция успешно отработала, то на выходе мы получим пустой XML-объект, поддерживающий методы
load() и
loadXML().
Метод
load() принимает в качестве аргумента URL xml-файла, который загружается в пустой объект, а метод
loadXML() принимает в качестве аргументв строку с XML-данными:
• Код JavaScript
var ieXMLObject = createXMLObject();
ieXMLObject.load("example.xml");
ieXMLObject = createXMLObject();
var xmlString = '<books><book id="1"><author>Petrov.I.S.</author></book></books>';
ieXMLObject.loadXML(xmlString);
Как и в случае XMLHttpRequest, созданный xml-объект поддерживает обработку события
onreadystatechange и изменяет свойство
readyState.
По умолчанию, для метода
load() поддерживается асинхронный режим, но его можно сменить с помощью свойства async:
• Код JavaScript
ieXMLObject = createXMLObject();
ieXMLObject.load("example.xml");
ieXMLObject = createXMLObject();
ieXMLObject.async = false;
ieXMLObject.load("example.xml");
После того, как XML-документ загружен, ссылку на корневой узел можно получить с помощью свойства
documentElement, и от него уже ходить по DOM-дереву привычными свойствами: nodeName, nodeType, firstChild, parentNode, nextSibling и др.
• Код JavaScript
ieXMLObject = createXMLObject();
var xmlString = '<books><book id="1"><author>Petrov.I.S.</author></book></books>';
ieXMLObject.loadXML(xmlString);
alert(ieXMLObject.documentElement.nodeName);
alert(ieXMLObject.documentElement.firstChild.nodeName);
Кроме стандартизированных привычных DOM-свойств Internet Explorer реализовал несколько своих собственных:
xml — возвращает xml-код указанного узла (аналог innerHTML).
text — возвращает текстовое содержимое текущего узла и всех его потомков (аналог innerText).
Кроме привычных свойств работы с DOM можно использовать и привычные методы: createElement, removeChild, setAttribute и др.
Обработка ошибок
Предположим вы загрузили xml-объект и не можете с ним нормально работать. К примеру, свойство
documentElement возвращает
null. Это значит, что при загрузке произошла ошибка, причину которой можно выяснить с помощью дочернего объекта
parseError, имеющий следущие свойства:
errorCode - возвращает целочисленный код ошибки. 0 - если ошибок нет и документ загружен и обработан.
filePos - позиция ошибки в файле
line - номер строки с ошибкой
linePos - позиция ошибки в строке
reason - описание причины ошибки
srcText - текст строки с ошибкой
url - url документа
Создадим xml-файл, с содержимым, намеренно содержащим ошибку (вместо закрывающего тега author запишем открывающий):
• Код без подсветки
<books>
<book id="1">
<author>Petrov.I.S.<author>
</book>
</books>
Естественно такой документ не будет обработан, и чтобы посомтреть в чем причина ошибки запишем такой код:
• Код JavaScript
ieXMLObject = createXMLObject();
ieXMLObject.onreadystatechange = function() {
if (ieXMLObject.parseError.errorCode != 0) {
alert(
"errorCode = " + ieXMLObject.parseError.errorCode + "\n" +
"filePos = " + ieXMLObject.parseError.filePos + "\n" +
"line = " + ieXMLObject.parseError.line + "\n" +
"linePos = " + ieXMLObject.parseError.linePos + "\n" +
"reason = " + ieXMLObject.parseError.reason + "\n" +
"srcText = " + ieXMLObject.parseError.srcText + "\n" +
"url = " + ieXMLObject.parseError.srcText
);
}
}
ieXMLObject.load("xml/example.xml");
Всплывающее окно с сообщением смотрим в здесь.
Не забудьте!
Такая реализация XML присуща только Internet Explorer!
О реализации в других браузерах статья будет размещена в ближайшее время.