Просмотр содержимого записной книжки

Просмотр содержимого записной книжки

Для того чтобы использовать схему XML DOM в сценарии SortNameMSXML.js, осуществляющем вывод информации из XML-файла book.xml в Блокнот, нужно внести изменения в три функции: GetTagVal(obj, tgName), PersonToArray(XNode) и FileToArray(). Сценарий, который получится в результате этих изменений, назовем SortNameXMLDOM.js.

В функции FileToArray() сначала создается пустой массив PersonArr и экземпляр XML объекта DOMDocument:

PersonArr=new Array();

XML = WScript.CreateObject("Msxml.DOMDocument");

Для загрузки содержимого файла book.xml (путь к этому файлу хранится в переменной PathBook) в объект xml, используется метод load:

XML.load(PathBook);

Указатель на корневой элемент записывается в переменную Root с помощью свойства documentElement объекта XML:

Root=XML.documentElement;

После этого нам остается в цикле перебрать все элементы Person (для корневого элемента они являются дочерними элементами первого уровня вложенности) и для каждого из них вызвать функцию PersonToArray():

for (i=1; i<=Root.childNodes.length-1; i++) {

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

 //первого уровня вложенности

 CurrNode=Root.childNodes.item(i);

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

 PersonToArray(CurrNode);

}

Функция PersonToArray(XNode) в SortNameXMLDOM.js имеет тот же вид, что и в сценарии SortNameMSXML.js:

function PersonToArray(XNode) {

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

 PersonRec=new Person();

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

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

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

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

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

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

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

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

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

 PersonArr[PersonArr.length]=PersonRec;

}

Здесь для построения функции GetTagVal(obj, tgName), которая возвращает значение дочернего для элемента obj элемента с именем tgName, используется метод getElementsByTagName, возвращающий коллекцию дочерних элементов с заданным именем:

function GetTagVal(obj, tgName) {

 var ElemList;

 //Создаем коллекцию дочерних для obj элементов, которые

 //задаются тегом tgName

 ElemList=obj.getElementsByTagName(tgName);

 //Проверяем, есть ли в коллекции ElemList элементы

 if (ElemList.length>0)

  //Возвращаем значение первого встретившегося элемента tgName

  return ElemList.item(0).text

 else return "";

}

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

Листинг 6.4. Чтение данных из XML-файла с помощью XML DOM

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

/* Имя: SortNameXMLDOM.js                                          */

/* Язык: JScript                                                   */

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

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

/*           помощью объектной модели XML DOM                      */

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

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

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) {

 var ElemList;

 //Создаем коллекцию дочерних для obj элементов, которые

 //задаются тегом tgName

 ElemList=obj.getElementsByTagName(tgName);

 //Проверяем, есть ли в коллекции ElemList элементы

 if (ElemList.length>0)

  //Возвращаем значение первого встретившегося элемента tgName

  return ElemList.item(0).text

 else return "";

}

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

function PersonToArray(XNode) {

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

 PersonRec=new Person();

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

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

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

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

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

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

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

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

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

 PersonArr[PersonArr.length]=PersonRec;

}

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

function FileToArray() {

 var XML,Root,NomRec,CurrNode,ex,i;

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

 PersonArr=new Array();

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

 XML = WScript.CreateObject("Msxml.DOMDocument");

 //Загружаем XML-документ из файла

 XML.load(PathBook);

 //Сохраняем в переменной Root ссылку на корневой элемент документа

 Root=XML.documentElement;

 //Перебираем все дочерние элементы первого уровня вложенности

 //для корневого элемента

 for (i=1; i<=Root.childNodes.length-1;i++) {

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

  CurrNode=Root.childNodes.item(i);

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

  PersonToArray(CurrNode);

 }

}

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

function TopReport(Mess) {

 FOut.WriteLine(Mess);

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

 FOut.WriteLine("");

}

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

function BottomReport(Mess) {

 FOut.WriteLine(Mess);

}

//Запись данных из объекта 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;

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

 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();

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