Книга: Windows Script Host для Windows 2000/XP

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

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

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

Оглавление книги


Генерация: 0.396. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз