Компания Microsoft расширила язык разметки HTML новым тегом <xml>, с по_ мощью которого создаются островки данных в формате XML в окружающем их «море» HTML_разметки. Когда IE встречает тег <xml>, он интерпретирует его как отдельный XML_документ, который можно извлечь методом document.getEle_ mentById() или другими DOM_методами языка HTML. Если в теге <xml> определен атрибут src, тогда вместо того, чтобы анализировать содержимое тега <xml>, XML_документ загружается с URL_адреса, указанного в этом атрибуте.
Если для работы веб_приложения необходимы XML_данные и эти данные заранее известны, определенно есть смысл включить их прямо в HTML_страницу: данные будут доступны сразу же, и приложению не потребуется устанавливать новое со_
21.1. Получение XML*документов
единение, чтобы их загрузить. Островки XML_данных – удобные объекты для этого. Существует возможность эмулировать островки данных в IE и в других броузерах с помощью программного кода, который приводится в примере 21.5.
Пример 21.5. Извлечение XML'документа из островка данных
/**
* Возвращает объект Document, в котором хранится содержимое тега <xml>
* с заданным идентификатором. Если тег <xml> имеет атрибут src, тогда
* выполняется загрузка документа с этого URL_адреса.
*
* Поскольку островки данных часто используются неоднократно, данная
* функция кэширует возвращаемые документы.
*/
XML.getDataIsland = function(id) { var doc;
// Сначала проверить кэш
doc = XML.getDataIsland.cache[id]; if (doc) return doc;
// Найти требуемый элемент
doc = document.getElementById(id);
// Если определен атрибут "src", загрузить документ с указанного URL_адреса var url = doc.getAttribute('src');
if (url) {
doc = XML.load(url);
}
// В противном случае, если атрибут src отсутствует, документ, который
// следует вернуть, содержится внутри тега <xml>. В Internet Explorer
// в переменной doc уже будет ссылка на требуемый объект документа.
// В других броузерах переменная doc ссылается на HTML_элемент, и нам
// нужно скопировать содержимое этого элемента в новый объект документа else if (!doc.documentElement) {// Если это еще не документ...
// Прежде всего, нужно найти элемент документа в теге <xml>.
// Это будет первый дочерний элемент тега <xml>, не являющийся текстом,
// комментарием или исполняемой инструкцией
var docelt = doc.firstChild; while(docelt != null) {
if (docelt.nodeType == 1 /*Node.ELEMENT_NODE*/) break; docelt = docelt.nextSibling;
}
// Создать пустой документ doc = XML.newDocument();
// Если узел <xml> имеет какое_то содержимое, импортировать его в новый документ if (docelt) doc.appendChild(doc.importNode(docelt, true));
}
// Поместить документ в кэш и вернуть его XML.getDataIsland.cache[id] = doc;
Этот программный код не совсем точно моделирует островки XML_данных в бро_ узерах, не относящихся к IE. HTML_стандарты требуют, чтобы броузеры не вы_ полняли синтаксический разбор неизвестных им тегов (а просто их игнорирова_ ли). Это означает, что броузеры не уничтожают XML_данные, расположенные в теге <xml>. Но это также означает, что любой текст, содержащийся в островках данных, по умолчанию будет отображаться броузером. Самый простой способ пре_ дотвратить это заключается в использовании следующей таблицы CSS_стилей:
Другая несовместимость с не относящимися к IE броузерами связана с тем, что они интерпретируют содержимое островков данных как HTML_текст, а не как XML_текст. Если, к примеру, воспользоваться сценарием из примера 21.5 в бро_ узере Firefox и затем сериализовать получившийся документ (как это сделать, показано в этой главе далее), можно обнаружить, что имена тегов преобразова_ ны в верхний регистр, поскольку Firefox предполагает, что имеет дело с HTML_ тегами. В большинстве случаев это не вызывает проблем, но в некоторых случа_ ях может стать источником неприятностей. Наконец, следует заметить, что про_ странства имен будут разрушены, если броузер интерпретирует XML_теги как HTML_теги. Это означает, что островки XML_данных не подходят для хранения таблиц XSL_стилей (более подробно об XSL будет рассказываться в этой главе да_ лее), поскольку эти таблицы всегда используют пространства имен.
Если вы хотите воспользоваться преимуществами, которые дает включение XML_данных непосредственно в HTML_страницу, но не желаете бороться с несо_ вместимостью броузеров из_за наличия островков XML_данных в тегах <xml>, то_ гда вам следует рассмотреть возможность включения в страницу XML_докумен_ тов в виде JavaScript_строк, которые затем можно преобразовать в документы с помощью программного кода, приводившегося в примере 21.4.