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

Поиск и удаление записи из книжки 

Поиск и удаление записи из книжки 

Рассмотрим сценарий 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>
<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 вместе со всеми его дочерними элементами
   Root.removeChild(Parent);
   //Выводим диалоговое окно с сообщением
   WshShell.Popup("Запись удалена!",0,
    "Работа с XML-файлом",vbInformation+vbOkOnly);
  }
  //Сохраняем содержимое XML-файла на диске
  XMLDoc.save(PathBook);
 }
}
//Построение путей к файлам
function InitPath() {
 BasePath=WshShell.CurrentDirectory+"";
 //Путь к файлу с данными
 PathBook=BasePath+"book.xml";
}
//Основная запускная функция
function Main() {
 var Res;
 //Создаем объект WshShell
 WshShell = WScript.CreateObject("WScript.Shell");
 //Определяем пути к файлам
 InitPath();
 LastName=InputName();
 //Запрос на удаление записи
 Res=WshShell.Popup("Удалить фамилию "+LastName+
  " из n"+PathBook+"?",0,
  "Работа с XML-файлом",vbQuestion+vbYesNo);
 if (Res==vbYes) { //Нажата кнопка Да
  //Ищем в книжке нужную фамилию и удаляем относящуюся к
  //ней запись
  FindAndDelRecord();
 }
}
/*******************  Начало  **********************************/
Main();
/*************  Конец *********************************************/
</script> 
</job>

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


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