- •Содержание
- •Глава 1. Хранение в данных в формате xml
- •§ 1.1. Назначение xml
- •§ 1.2. Достоинства xml
- •§ 1.3. Заменит ли xml html?
- •§ 1.4. Структура xml
- •1.4.1. Объявление xml
- •1.4.2. Корневой элемент
- •1.4.3. Комментарий
- •Глава 2. Отображение и хранение экономических xml-документов с использованием связывания данных
- •Основные шаги
- •§ 2.1. Использование связывания данных по одной записи
- •Перемещение между записями
- •§ 2.2. Отображение и хранение экономического xml документа по отдельным записям
- •Как хранятся данные xml
- •Проверка на наличие ошибок xml
- •Cцепление html-элементов с xml-элементами
- •§ 2.3. Использование табличного сцепления данных
- •Использование одной html-таблицы для отображения простого набора записей
- •§ 2.4. Использование постраничного отображения экономического xml документа
- •Другие способы связывания данных
- •§ 2.5. Связывание с другими html-элементами
- •§ 2.6. Использование сценариев dso для отображения экономического xml документа
- •Заключение
- •Список использованной литературы
- •Приложения
§ 2.6. Использование сценариев dso для отображения экономического xml документа
Последний этап моей работы посвящен усложнению сценария обработки данных, а именно включению в XML документ поля для поиска данных, который использует DSO для работы с соответствующим набором записей XML-документа. В этом этапе использованы методы и свойства объекта DSO recordset для поиска книг в документе games big.xml. Приемы, используемые для поиска и отображения данных XML, подходят только для XML-документа, организованного как простой набор записей.
В HTML 6 представлена HTML-страница, содержащая этап сценария.
<HTML>
<HEAD>
<TITLE>Game Finder</TITLE>
</HEAD>
<BODY>
<XML ID="dsogames" SRC="games big.xml"></XML>
<H2>Поиск игры</H2>
Название: <INPUT TYPE="TEXT" ID="SearchText"> 
<BUTTON ONCLICK='Findgame()'>Поиск</BUTTON>
<HR>
Результат:<P>
<DIV ID=ResultDiv></DIV>
<SCRIPT LANGUAGE="JavaScript">
function Findgame ()
{
SearchString = SearchText.value.toUpperCase();
if (SearchString == "")
{
ResultDiv.innerHTML = "<Введите название игры в меню "
+ "'Название' >";
return;
}
dsogames.recordset.moveFirst();
ResultHTML = "";
while (!dsogames.recordset.EOF)
{
TitleString = dsogames.recordset("NAME").value;
if (TitleString.toUpperCase().indexOf(SearchString)
>=0)
ResultHTML += "<I>"
+ dsogames.recordset("NAME")
+ "</I>, "
+ "<B>"
+ dsogames.recordset("AUTHOR")
+ "</B>, "
+ dsogames.recordset("GENRE")
+ ", "
+ dsogames.recordset("YEAR")
+ " год, "
+ dsogames.recordset("PLATFORM")
+ "<P>";
dsogames.recordset.moveNext();
}
if (ResultHTML == "")
ResultDiv.innerHTML = "<игра не найдена>";
else
ResultDiv.innerHTML = ResultHTML;
}
</SCRIPT>
</BODY>
</HTML>
HTML 6. games find.html
HTML-страница отображает элемент INPUT типа TEXT, который разрешает пользователю ввести одну строку искомого текста:
<INPUT TYPE="TEXT" ID="SearchText">
Страница также отображает элемент BUTTON (кнопка) с надписью "Search":
<BUTTON ONCLICK='Findgame()'>Search</BUTTON>
Когда пользователь щелкает мышью на кнопке, вызывается функция сценария Findgames, которая извлекает искомый текст из элемента INPUT и просматривает названия из всех записей GAME в XML-документе в поисках текста, после чего отображает найденные записи GAME содержащие этот текст, как показано на рисунке 5.
Рис. 5
Функция Findgame сценария содержится в элементе SCRIPT и написана на языке JSCRIPT:
<SCRIPT LANGUAGE="JavaScript">
function Findgames ()
{
SearchString = SearchText.value.toUpperCase();
if (SearchString == "")
{
ResultDiv.innerHTML = "<Введите название игры в меню "
+ "'Название' >";
return;
}
dsogames.recordset.moveFirst();
ResultHTML = "";
while (!dsogames.recordset.EOF)
{
TitleString = dsogames.recordset("NAME").value;
if (TitleString.toUpperCase().indexOf(SearchString)
>=0)
ResultHTML += "<I>"
+ dsogames.recordset("NAME")
+ "</I>, "
+ "<B>"
+ dsogames.recordset("AUTHOR")
+ "</B>, "
+ dsogames.recordset("GENRE")
+ ", "
+ dsogames.recordset("YEAR")
+ " год, "
+ dsogames.recordset("PLATFORM")
+ "<P>";
dsogames.recordset.moveNext();
}
if (ResultHTML == "")
ResultDiv.innerHTML = "<игра не найдена>";
else
ResultDiv.innerHTML = ResultHTML;
}
</SCRIPT>
Сначала функция Findgame получает текст, введенный через элемент INPUT (он имеет атрибут ID SearchText), а затем использует метод toUpperCase JScript для преобразования символов текста в прописные буквы. (Функция Findgames преобразует текст в прописные, чтобы поиск осуществлялся без учета регистра.)
SearchString = SearchText.value.toUpperCase();
Если пользователь не ввел текст в поле INPUT, функция отображает сообщение и завершает свою работу:
if (SearchString == "")
{
ResultDiv.innerHTML = "<Введите название игры в меню "
+ "'Title text' box.>";
return;
}
ResultDiv есть идентификатор ID элемента DIV в нижней части страницы, который отображает результаты поиска. Присвоение текста (который может включать HTML-разметку) свойству innerHTML элемента DIV приводит к отображению этого текста (с учетом всей содержащейся в нем HTML-разметки).
Далее функция делает текущей первую запись XML, используя метод recordset.moveFirst, с которым вы познакомились ранее:
dsogames.recordset.moveFirst();
Затем она очищает строковую переменную, используемую для хранения HTML-разметки найденных результатов (ResultHTML):
ResultHTML = "";
После этого функция Findgames выполняет цикл просмотра всех записей в XML-документе. Для анализа момента завершения цикла при достижении конца файла используется свойство recordset.EOF, а для перехода к новой записи используется метод recordset.moveNext:
while (!dsogames.recordset.EOF)
{
TitleString = dsogames.recordset("NAME").value;
if (TitleString.toUpperCase().indexOf(SearchString)
>=0)
ResultHTML += "<I>"
+ dsogames.recordset("NAME")
+ "</I>, "
+ "<B>"
+ dsogames.recordset("AUTHOR")
+ "</B>,
+ dsogames.recordset("GENRE")
+ ", "
+ dsogames.recordset("YEAR")
+ " pages, "
+ dsogames.recordset("PLATFORM")
+ "<P>";
dsogames.recordset.moveNext();
}
В начале цикла функция получает значение поля NAME для текущей записи:
TitleString = dsogames.recordset("NAME").value;
Выражение справа от знака равенства представляет собой краткую нотацию вызова свойства fields объекта recordset. Полная нотация выглядит следующим образом:
TitleString = dsogames.recordset.fields("NAME").value;
Свойство fields содержит множество всех полей, принадлежащих текущей записи. Чтобы получить доступ к определенному полю, следует поместить в скобках имя этого поля, и вы получите его содержимое как строку, через свойство value, добавленное в конце выражения.
Далее в цикле используется метод indexOf JScript для анализа, содержит ли название в текущей записи искомый текст. Если искомый текст обнаружен, код внутри оператора if добавляет к строке ResultHTML текст и HTML-разметку, требуемую для отображения текущей записи:
if (TitleString.toUpperCase().indexOf(SearchString)
>=0)
ResultHTML += "<I>"
+ dsogames.recordset("NAME")
+ "</I>, "
+ "<B>"
+ dsogames.recordset("AUTHOR")
+ "</B>,
+ dsogames.recordset("GENRE")
+ ", "
+ dsogames.recordset("YEAR")
+ " pages, "
+ dsogames.recordset("PLATFORM")
+ "<P>";
По выходу из цикла функция назначает HTML-разметку, содержащую результаты, свойству innerHTML элемента DIV в разделе BODY документа, который используется для отображения этих результатов (данный элемент DIV имеет идентификатор ResultDiv):
if (ResultHTML == "")
ResultDiv.innerHTML = "<игра не найдена> ";
else
ResultDiv.innerHTML = ResultHTML;
Элемент DIV воспринимает HTML-разметку и сразу же отображает результаты.