Windows Script Host для Windows 2000/XP - Андрей Попов
Шрифт:
Интервал:
Закладка:
  "добавлена в файл "+PathBook, 0,
  "Работа с XML-файлом", vbInformation+vbOkOnly);
В }
}
/******************* Начало **********************************/
Main();
/************* Конец *********************************************/В
РџРѕРёСЃРє Рё удаление записи РёР· книжкиВ
Рассмотрим сценарий FindAndDelRecord.wsf, с помощью которого можно будет полностью удалить из записной книжки данные о человеке, фамилия которого введена в диалоговом окне (рис. 6.1).
Рис. 6.1. Ввод фамилии для удаления
Сценарий FindAndDelRecord.wsf реализован в виде WS-файла для того, чтобы можно было внутри JScript-кода воспользоваться функцией InputName на языке VBScript, которая реализует диалоговое окно с полем ввода, показанное на рис. 6.1:
Function InputName
 'Вводим фамилию в диалоговом окне
 InputName = InputBox("Введите фамилию для удаления:", "Записная книжка")
End Function
Фамилия, которую следует найти и удалить в записной книжке, сохраняется в глобальной переменной LastName:
LastName=InputName();
Непосредственно поиск и удаление данных производятся в функции FindAndDelRecord(). Здесь, как и во всех рассмотренных ранее примерах, сначала создается экземпляр XMLDoc объекта DOMDocument, с помощью метода load загружается файл book.xml и указатель на корневой элемент сохраняется в переменной Root:
XMLDoc = WScript.CreateObject("Msxml.DOMDocument");
XMLDoc.load(PathBook);
Root=XMLDoc.documentElement;
Для выделения в записной книжке всех фамилий, которые требуется удалить, используется метод selectNodes(). В качестве аргумента этого метода подставляется строка sSelect, которая указывает, что нужно искать расположенные внутри элементов Person элементы с именем LastName и значением, которое совпадает со значением переменной LastName. Все найденные элементы помещаются в коллекцию NodeList:
//Формируем строку для поиска фамилии
sSelect="Person/LastName[text()='"+LastName+"']";
//Создаем коллекцию NodeList всех элементов LastName,
//значение которых совпадает со значением переменной LastName
NodeList=XMLDoc.documentElement.selectNodes(sSelect);
Если найден хотя бы один подходящий элемент LastName, т.е. коллекция NodeList не является пустой, то для каждого такого элемента в цикле for определяется родительский элемент (в нашем случае это элемент Person) и этот элемент вместе со всеми своими дочерними элементами удаляется с помощью метода removeChild():
for (i=0;i<=NodeList.length-1;i++) {
 //Определяем родительский элемент (Person) для найденного
 //элемента LastName
В Parent=NodeList.item(i).parentNode;
 //Удаляем элемент Person вместе со всеми его дочерними элементами
В Root.removeChild(Parent);
 //Выводим диалоговое окно с сообщением
 WshShell.Popup("Запись удалена!",0,
 "Работа с XML-файлом",vbInformation+vbOkOnly);
}
После удаления всех записей содержимое XML-файла book.xml сохраняется на диске с помощью метода save():
XMLDoc.save(PathBook);
Полный текст сценария FindAndDelRecord.wsf приводится в листинге 6.6.
Листинг 6.6. Поиск и удаление данных в XML-файле с помощью XML DOM<job id="PhoneBook">
<runtime>
<description>
РРјСЏ: FindAndDelRecord.wsf
Описание: Записная книжка (данные в XML-файле book.xml).
         Поиск и удаление элементов из XML-файла
</description>
</runtime>
<script language="VBScript">
 'Функция возвращает фамилию для удаления
В Function InputName
 'Вводим фамилию в диалоговом окне
 InputName = InputBox("Введите фамилию для удаления:", "Записная книжка")
В End Function
</script>
<script language="JScript">
//Объявляем переменные
var
В WshShell,
 LastName, //Удаляемая фамилия
 BasePath, //Путь к текущему каталогу
 PathBook, //Путь к файлу с данными
 XMLDoc,   //XML-файл с данными
 NomRec=0, //Счетчик количества записей
 PersonRec, //Объект для хранения данных об одном человеке
 PersonArr; //Массив для хранения объектов PersonRec
//Рнициализируем константы для диалоговых РѕРєРѕРЅ
var vbYesNo=4,vbQuestion=32,vbInformation=64,vbYes=6,vbOkOnly=0;
//Поиск фамилии в записной книжке и удаление всех
//реквизитов, относящихся к этой фамилии
function FindAndDelRecord() {
В var Root,sSelect,i,Parent,NodeList;
 //Создаем объект DOMDocument
В XMLDoc = WScript.CreateObject("Msxml.DOMDocument");
 //Загружаем XML-файл
В XMLDoc.load(PathBook);
 //Сохраняем в переменной Root ссылку на корневой элемент
 //документа
В Root=XMLDoc.documentElement;
 //Формируем строку для поиска фамилии
В sSelect="Person/LastName[text()='"+LastName+"']";
 //Создаем коллекцию NodeList всех элементов LastName,
 //значение которых совпадает со значением переменной LastName
В NodeList=XMLDoc.documentElement.selectNodes(sSelect);
 if (NodeList.length==0) //Коллекция NodeList пуста
 //Выводим диалоговое окно с сообщением
 WshShell.Popup("Фамилия "+LastName+
  " не найдена в записной книжке!",0,
  "Работа с XML-файлом",vbInformation+vbOkOnly);
 else { //Требуемая фамилия найдена
 //Цикл по всем найденным элементам LastName
В for (i=0;i<=NodeList.length-1;i++) {
  //Определяем родительский элемент (Person) для найденного
  //элемента LastName
В В Parent=NodeList.item(i).parentNode;
  //Удаляем элемент Person вместе со всеми его дочерними элементами