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

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

закрыть рекламу

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

Для того чтобы использовать схему 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();
/*************  Конец *********************************************/

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


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