Пример сценария

Пример сценария

С помощью приведенного ниже сценария SortNameMSXML.js все записи из book.xml сортируются по фамилии и отображаются в Блокноте. Напомним, что аналогичную задачу для текстового файла с разделителями book.txt реализует сценарий SortName.js, приведенный в листинге 5.21. Алгоритм работы сценария SortNameMSXML.js, как и SortName.js, сводится к следующим основным шагам.

1. Информация из файла book.xml считывается в массив PersonArr. Каждый элемент массива является экземпляром объекта Person, в котором хранятся все данные для одного человека.

2. Массив PersonArr сортируется по возрастанию фамилий.

3. Содержимое всех записей из массива PersonArr выводится в текстовый файл out.txt.

4. Файл out.txt открывается в Блокноте.

Таким образом, специфика работы с XML-файлом проявляется лишь при считывании данных из файла book.xml в массив PersonArr. Для этого используется функция FileToArray(). Сначала в этой функции создается пустой массив PersonArr и экземпляр XML объекта XML Document:

PersonArr=new Array();

XML=WScript.CreateObject("MSXML");

В свойство url объекта XML записывается путь к файлу book.xml, который хранится в переменной PathBook:

XML.url=PathBook;

Далее в функции FileToArray о определяется количество элементов <Person>, т.е. количество записей в книжке (переменная NomRec):

NamRec=XML.root.children.item("Person").length;

В цикле for происходит перебор всех элементов <Person>, которые являются элементами соответствующей коллекции:

//Перебираем коллекцию XML-элементов Person

for (i=0; i<NomRec; i++) {

 //Выделяем в коллекции XML-элементов i-й элемент Person

 XItem=XML.root.children.item("Person", i);

 //Добавляем новый элемент, в массив объектов Person

 PersonToArray(XItem);

}

Как мы видим, каждый элемент <Person> передается в качестве аргумента в функцию PersonToArray(XItem), в которой создается новый экземпляр PersonRec объекта Person, заполняются поля этого объекта и происходит добавление PersonRec в массив PersonArr:

function PersonToArray(XItem) {

 //Создаем новый экземпляр PersonRec объекта Person

 PersonRec=new Person();

 //Заполняем поля объекта PersonRec

 PersonRec.LastName=GetTagVal(XItem,"LastName");

 PersonRec.Name=GetTagVal(XItem,"Name");

 PersonRec.Phone=GetTagVal(XItem,"Phone");

 PersonRec.Street=GetTagVal(XItem,"Street");

 PersonRec.House=GetTagVal(XItem,"House");

 PersonRec.App=GetTagVal(XItem,"App");

 PersonRec.Note=GetTagVal(XItem,"Note");

 //Сохраняем объект PersonRec в массиве

 PersonArr[PersonArr.length]=PersonRec;

}

Поля объекта PersonRec заполняются с помощью функции GetTagVal(obj, tgName), которая возвращает значение дочернего для элемента obj элемента с именем tgName:

function GetTagVal(obj, tgName) {

 //Возвращаем значение тега tgName

 return obj.Children.Item(tgName,0).Text;

}

В листинге 6.3 приводится полный текст сценария SortNameMSXMLjs. 

Листинг 6.3. Чтение данных из XML-файла с помощью объектной модели Internet Explorer 4.0

/*******************************************************************/

/* Имя: SortNameMSXML.js                                           */

/* Язык: JScript                                                   */

/* Описание: Записная книжка (данные в XML-файле book.xml).        */

/*           Вывод всех записей с сортировкой по фамилии с         */

/*           помощью объектной модели Internet Explorer 4.0        */

/*******************************************************************/

//Объявляем переменные

var

 WshShell,FSO,

 BasePath,     //Путь к текущему каталогу

 PathBook,     //Путь к файлу с данными

 PathOut,      //Путь к выходному файлу

 FBook,        //Файл с данными

 FOut,         //Выходной файл

 NomRec=0,     //Счетчик количества записей

 PersonRec,    //Объект для хранения данных об одном человеке

 PersonArr;    //Массив для хранения объектов PersonRec

 ForWriting=2; //Константа для создания выходного файла

//Конструктор объекта Person

function Person(LastName,Name,Phone,Street,House,App,Note) {

 this.LastName=LastName; //Фамилия

 this.Name=Name;         //Имя

 this.Phone=Phone;       //Телефон

 this.Street=Street;     //Улица

 this.House=House;       //Дом

 this.App=App;           //Квартира

 this.Note=Note;         //Примечание

}

//Определение значения тега tgName XML-элемента obj

function GetTagVal(obj, tgName) {

 //Возвращаем значение тега tgName

 return obj.Children.Item(tgName,0).Text;

}

//Заполнение нового элемента массива

function PersonToArray(XItem) {

 //Создаем новый экземпляр PersonRec объекта Person

 PersonRec=new Person();

 //Заполняем поля объекта PersonRec

 PersonRec.LastName=GetTagVal(XItem,"LastName");

 PersonRec.Name=GetTagVal(XItem,"Name");

 PersonRec.Phone=GetTagVal(XItem,"Phone");

 PersonRec.Street=GetTagVal(XItem,"Street");

 PersonRec.House=GetTagVal(XItem,"House");

 PersonRec.App=GetTagVal(XItem,"App");

 PersonRec.Note=GetTagVal(XItem,"Note");

 //Сохраняем объект PersonRec в массиве

 PersonArr[PersonArr.length]=PersonRec;

}

//Создание массива объектов Person

function FileToArray() {

var

 XML,NomRec,XItem,ex;

 //Создаем массив PersonArr

 PersonArr=new Array(); 

 //Создаем объект MSXML

 XML=WScript.CreateObject("MSXML");

 //Задаем путь к файлу с данными

 XML.url=PathBook;

 //Инициализируем счетчик числа элементов Person

 //в XML-файле

 NomRec=0;

 try {

  //Определяем число элементов Person в XML-файле

  NomRec=XML.root.children.item("Person").length;

  if (typeof(NomRec)=="undefined") NomRec=1;

 } catch (ex) {

  NomRec=0;

 }

 //Перебираем коллекцию XML-элементов Person

 for (i=0;i<NomRec;i++) {

  //Выделяем в коллекции XML-элементов i-й элемент Person

  XItem=XML.root.children.item("Person",i);

  //Добавляем новый элемент в массив объектов Person

  PersonToArray(XItem);

 }

}

//Запись в выходной файл заголовка отчета

function TopReport(Mess) {

 FOut.WriteLine(Mess);

 FOut.WriteLine("--------------------");

 FOut.WriteLine("");

}

//Запись в выходной файл итоговой информации

function BottomReport() {

 FOut.WriteLine("Всего записей: "+NomRec);

}

//Запись данных из объекта Person в выходной файл

function PrintPerson(PersRec) {

 FOut.WriteLine("Фамилия: "+PersRec.LastName);

 FOut.WriteLine("Имя: "+PersRec.Name);

 FOut.WriteLine("Телефон: "+PersRec.Phone);

 FOut.WriteLine("Улица: "+PersRec.Street);

 FOut.WriteLine("Дом: "+PersRec.House);

 FOut.WriteLine("Кв.: "+PersRec.App);

 FOut.WriteLine("Заметки: "+PersRec.Note);

 FOut.WriteLine("*********************************");

 NomRec++;

}

//Сортировка массива и вывод его содержимого в выходной файл

function ListPersonArray() {

var i,a;

 //Сортировка массива по фамилии

 PersonArr.sort(SortLastName);

 //Цикл по всем элементам массива PersonArr

 for (i=0;i<=PersonArr.length-1;i++) {

  //Запись информации в выходной файл

  PrintPerson(PersonArr[i]);

 }

}

//Функция для сортировки массива по фамилии

function SortLastName(Pers1,Pers2) {

 if (Pers1.LastName<Pers2.LastName) return -1;

 else if (Pers1.LastName==Pers2.LastName) return 0;

 else return 1;

}

//Вывод содержимого файла с данными

function ListFile() {

 //Считывание данных из файла в массив

 FileToArray();

 //Запись информации из массива в выходной файл

 ListPersonArray();

}

//Просмотр содержимого выходного файла в Блокноте

function MakeOut() {

 //Закрываем выходной файл

 FOut.Close();

 //Открываем выходной файл в Блокноте

 WshShell.Run("notepad "+PathOut,1);

}

//Построение путей к файлам

function InitPath() {

 BasePath=WshShell.CurrentDirectory+"\";

 //Путь к файлу с данными

 PathBook=BasePath+"book.xml",

 //Путь к выходному файлу

 PathOut=BasePath+"out.txt";

}

//Основная запускная функция

function Main() {

 //Создаем объект WshShell

 WshShell = WScript.CreateObject("WScript.Shell");

 //Определяем пути к файлам

 InitPath();

 //Создаем объект FileSystemObject

 FSO=WScript.CreateObject("Scripting.FileSystemObject");

 //Открываем выходной файл для записи

 FOut=FSO.OpenTextFile(PathOut,ForWriting,true);

 //Печатаем заголовок отчета

 TopReport("Сортировка по фамилии");

 //Выводим содержимого файла с данными

 ListFile();

 //Печатаем итоговую информацию

 BottomReport("Всего записей: "+PersonArr.length);

 //Открываем выходной файл в Блокноте

 MakeOut();

}

/*******************  Начало  **********************************/

Main();

/*************  Конец *********************************************/

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Пример сценария

Из книги автора

Пример сценария С помощью приведенного ниже сценария SortNameMSXML.js все записи из book.xml сортируются по фамилии и отображаются в Блокноте. Напомним, что аналогичную задачу для текстового файла с разделителями book.txt реализует сценарий SortName.js, приведенный в листинге 5.21. Алгоритм


Выполнение сценария

Из книги автора

Выполнение сценария Открытый в отладчике сценарий может выполняться в разных режимах с помощью соответствующих команд меню Debug.С помощью команды Debug|Run (или нажатия клавиши <F5) можно выполнить все операторы сценария до первой точки прерывания.Для того чтобы выполнить


Элементы сценария убеждения

Из книги автора

Элементы сценария убеждения Сценарий, при построении которого учитываются требования маркетологов, веб-аналитиков и покупателей, мы называем сценарием убеждения. Давайте рассмотрим, из чего он


Запуск сценария

Из книги автора

Запуск сценария Сценарий можно запустить непосредственно в окне Solution Explorer. Проще всего перетащить сценарий и опустить его на ссылку на базу данных, в которую нужно внести изменения. Или иначе, щелкните правой кнопкой мыши на сценарии и выберите в контекстном меню команду


Пример сценария клиента

Из книги автора

Пример сценария клиента Чтобы продемонстрировать роль сценариев клиента, давайте выясним, как можно выполнить перехват событий, посылаемых HTML-элементами пользовательского интерфейса клиента. Предположим, что вы добавили в свою HTML-страницу default.htm тип Button (с именем btnHelp),


2.1. Запуск сценария

Из книги автора

2.1. Запуск сценария Запустить сценарий можно командой sh scriptname[ 8 ] или bash scriptname. (Не рекомендуется запуск сценария командой sh <scriptname>, поскольку это запрещает использование устройства стандартного ввода stdin в скрипте). Более удобный вариант -- сделать файл скрипта


Пример 20-1. Запуск сценария в ограниченном режиме

Из книги автора

Пример 20-1. Запуск сценария в ограниченном режиме #!/bin/bash# Если sha-bang задать в таком виде: "#!/bin/bash -r"# то это приведет к включению ограниченного режима с момента запуска скрипта.echoecho "Смена каталога."cd /usr/localecho "Текущий каталог: `pwd`"echo "Переход в домашний каталог."cdecho "Текущий


Пример 33-5. Комбинирование сценария Bash и Perl в одном файле

Из книги автора

Пример 33-5. Комбинирование сценария Bash и Perl в одном файле #!/bin/bash# bashandperl.shecho "Вас приветствует часть сценария, написанная на Bash."# Далее могут следовать другие команды Bash.exit 0# Конец сценария на Bash.# =======================================================#!/usr/bin/perl# Эта часть сценария должна вызываться с


10.7. Создание файла сценария

Из книги автора

10.7. Создание файла сценария Конечно, ввод многострочных команд в режиме командной строки не слишком удобен и чреват ошибками, поэтому лучше всего размещать такие команды в файлах сценариев. Кроме того, в сценариях допускается наличие пустых строк и комментариев, что


16.2. Структура сценария

Из книги автора

16.2. Структура сценария В книге недостаточно внимания уделяется методике создания совершенных сценариев. Здесь речь идет, в основном, о программном коде, который может послужить прототипом для создания целого семейства новых сценариев. Не следует использовать сложные


16.3. Выполнение сценария

Из книги автора

16.3. Выполнение сценария Ниже рассматривается пример, который уже обсуждался ранее. В данном случае, файл называется cleanup.$ pg cleanup#!/bin/sh#имя: cleanup#это общий сценарий, выполняющий очистку echo "starting cleanup…wait"rm /usr/local/apps/log/*.logtail -40 /var/adm/messages /tmp/messagesrm /var/adm/messagesmv /tmp/messages /var/adm/messages echo


Написание сценария

Из книги автора

Написание сценария Итак, с панелью Actions мы вкратце познакомились. Конечно, полностью ее возможности (кстати, весьма широкие) мы не рассмотрели, но сейчас нам важнее написать наш первый сценарий, чем выяснять, чем богата эта панель. Позже мы займемся ей более подробно.Выше