Андрей Попов - Windows Script Host для Windows 2000/XP
Напишем сценарий InsertRecords.js, который будет извлекать данные из XML-файла book.xml и добавлять записи с этими данными в таблицу Phone.dbf, для доступа к которой мы предварительно создали DSN (рис. 9.9).
Сценарий InsertRecords.js будет состоять из нескольких функций, главной из которых является Main(). В этой функции сначала создается объект WshShell и определяется путь к XML-файлу, который должен находиться в текущем каталоге:
//Создаем объект WshShell
WshShell = WScript.CreateObject("WScript.Shell");
//Путь к XML-файлу с данными
PathBook=WshShell.CurrentDirectory+"\book.xml";
Для доступа к таблице Phone мы создаем объект Connection, который позволяет с помощью метода Open() устанавливать связь с заданной базой данных. Для этого необходимо в качестве параметра Open() указать строку с именем источника данных, к которому происходит обращение (в нашем случае эта строка имеет вид "DSN=PhoneDS"):
//Создаем объект Connection
Connect=WScript.CreateObject("ADODB.Connection");
//Формируем строку с параметрами соединения с БД
//(указываем нужный DSN)
SConnect="DSN=PhoneDS";
//Устанавливаем связь с БД
Connect.Open(SConnect);
После этого происходит вызов функции XMLToBase(), в которой происходит разбор XML-файла с помощью объектной модели XML DOM (применение XML DOM было подробно описано в главе 7).
//Копирование данных из XML-файла в таблицу Phone
function XMLToBase() {
В var XML,Root,NomRec,CurrNode,i;
 //Создаем объект 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);
 //Вставляем новую запись в таблицу Phone
В PersonToTable(CurrNode);
В }
}В
Как мы видим, в функции XMLToBase() определяется цикл for, в котором для каждого XML-элемента, содержащего данные об одном человеке, происходит вызов функции PersonToTable(XNode). В функции PersonToTable(XNode) формируется SQL-запрос INSERT INTO Phone…, который позволяет вставить в таблицу Phone новую запись с заданными значениями полей, например:
INSERT INTO Phone (LastName, Name, Phone, Street, House, App, Notes)
VALUES ('Рванов', 'Рван', '17-17-17', 'Садовая', '4', '6', 'Очень хороший человек')
Строится строка с SQL-запросом (переменная SSQL) следующим образом:
//Строим список значений полей добавляемой записи
SSQL+="'"+GetTagVal(XNode, "LastName")+"',";
SSQL+="'"+GetTagVal(XNode, "Name")+"',";
SSQL+="'"+GetTagVal(XNode, "Phone")+"',";
SSQL+="'"+GetTagVal(XNode, "Street")+"',";
SSQL+="'"+GetTagVal(XNode, "House")+"',";
SSQL+="'"+GetTagVal(XNode, "App")+"',";
SSQL+="'"+GetTagVal(XNode, "Note")+"'";
//Формируем текст SQL-запроса для вставки записи
SSQL="INSERT INTO Phone (LastName, Name, Phone, Street, House, App, Notes) VALUES ("+SSQL+")";
После формирования переменной SSQL происходит вызов SQL-запроса с помощью метода Execute() объекта Connection:
//Выполняем подготовленный SQL-запрос (добавляем запись в таблицу)
Connect.Execute(SSQL);
После окончания копирования данных в функции Main() выводится соответствующее сообщение:
//Выводим сообщение об окончании переноса данных
WshShell.Popup("Данные из XML-файла в таблицу перенесены!", 0, "Работа с базой данных", vbInformation+vbOkOnly);
Полностью текст сценария InsertRecords.js приведен в листинге 9.1.
Листинг 9.1. Копирование данных из XML-файла в таблицу БД/*******************************************************************/
/* РРјСЏ: InsertRecords.jsВ В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В */
/* Язык: JScript                                                  */
/* Описание: Копирование данных из XML-файла таблицу базы         */
/*          данных                                               */
/*******************************************************************/
//Объявляем переменные
var
В WshShell, //Ркземпляр объекта WshShell
 BasePath, //Путь к текущему каталогу
 PathBook, //Путь к файлу с данными
 NomRec=0, //Счетчик количества записей
 SConnect, //Строка с параметрами соединения с БД
В Connect;В //Ркземпляр объекта Connection
//Рнициализируем константы для диалоговых РѕРєРѕРЅ
var vbInformation=64,vbOkOnly=0;
//Определение значения тега 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 PersonToTable(XNode) {
 var SSQL=""; //Переменная для формирования текста SQL-запроса
 //Строим список значений полей добавляемой записи
В SSQL+="'"+GetTagVal(XNode,"LastName")+"',";
В SSQL+="'"+GetTagVal(XNode,"Name")+"',";
В SSQL+="'"+GetTagVal(XNode,"Phone")+"',";
В SSQL+="'"+GetTagVal(XNode,"Street")+"',";
В SSQL+="'"+GetTagVal(XNode,"House")+"',";
В SSQL+="'"+GetTagVal(XNode,"App")+"',";
В SSQL+="'"+GetTagVal(XNode,"Note")+"'";
 //Формируем текст SQL-запроса для вставки записи
В SSQL="INSERT INTO Phone (LastName,Name,Phone,Street,House,App,Notes) VALUES ("+SSQL+")";
 //Выполняем подготовленный SQL-запрос (добавляем запись в таблицу)