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

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

С помощью приведенного ниже сценария 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();

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