Добрый день! Нашел в SDK скрипт по работе с xml файлом.
Имеется xml файл (client.xml), который имеет следующий вид:
records>
record>
fio>Иванов Иванfio>
company>Старcompany>
position>Начальник отделаposition>
tel>7777777tel>
email>ivan@gmail.comemail>
country>Ukrainecountry>
city>Kievcity>
address>Пушкина, 10address>
note>note>
record>
records>
Создав простое окно (от родителя BaseGridArea) вызываю его планировщиком windows, повесив на событие OnPrepare след. скрипт,взятый с SDK пытаюсь получить значения fio, company...., и на событие OnShow скрипт закрытия окна - так как это было уже описано на форуме:
var Storage = new ActiveXObject('TSObjectLibrary.XMLStorage');
var StorageNode = new ActiveXObject('TSObjectLibrary.XMLStorageNode');
// Объект хранения представления дерева узлов в текстовом виде
var Value = new ActiveXObject('TSObjectLibrary.Value');
Value.Value = new ActiveXObject('TSObjectLibrary.StringsList');
// Файл для загрузки XML-данных (необходимо наличие корректного XML-файла
// по указанному адресу)
var FileName = 'C:\client.xml';
// Загрузка XML-данных из файла
Storage.LoadFromFile(FileName);
// Вывод текста XML
//var MessageString = Storage.Text;
//ShowMessage("Загруженный XML-файл:\n " + MessageString);
// Корневой узел
StorageNode = Storage.RootNode;
// Построение дерева для загруженого XML-документа
BuildTree(-1, StorageNode, Value);
// Вывод дерева узлов XML
//MessageString = Value.Value.Text;
//ShowMessage("Вывод дерева узлов:\n " + MessageString);
//-----------------------------------------------------------------------------
// Применение методов интерфейса IXMLStorageNode.
//-----------------------------------------------------------------------------
var record = StorageNode.GetChildNode('record');
var fio = StorageNode.GetChildNode('record').GetChildNode('fio');
var company = StorageNode.GetChildNode('record').GetChildNode('company');
var position = StorageNode.GetChildNode('record').GetChildNode('position');
var tel = StorageNode.GetChildNode('record').GetChildNode('tel');
var email = StorageNode.GetChildNode('record').GetChildNode('email');
var country = StorageNode.GetChildNode('record').GetChildNode('country');
var city = StorageNode.GetChildNode('record').GetChildNode('city');
var address = StorageNode.GetChildNode('record').GetChildNode('address');
// В след. строке пытаюсь получить значение fio
var fioValue = StorageNode.GetChildNode('record').GetChildNode('fio').Text;
}
// Функция вывода сообщения
function ShowMessage(Str) {
for (var i = 1; i arguments.length; i++ ) {
Str = Str.replace(new RegExp('%' + i), arguments[i]);
}
// WScript.Echo(Str);
ShowInformationDialog(Str);
}
// Функция рекурсивного построение дерева узлов
function BuildTree(Level, Item, Value) {
// Строка для хранения конечного результата
var TotalString = new String();
// Строка выравнивания позиций узлов по ширине нижних уровней
var WidthString = new String();
// Переход на уровень вниз
Level++;
// Создание текущей глубины обхода для текстового представления,
//если она не была достигнута
if (Level >= Value.Value.Count) {
Value.Value.Add('');
}
// Cчитывание строки структуры уровня для добавления узлов
// того же уровня
TotalString = Value.Value.Items(Level);
// Выравнивание узла верхнего уровня по ширине нижних узлов.
for (var k = Level + 1; k Value.Value.Count; k++) {
WidthString = Value.Value.Items(k);
while (TotalString.length WidthString.length) {
TotalString += '_';
}
}
// Добавление элемента в текстовое представление
TotalString = TotalString + '' + Item.Name + '>';
Value.Value.Items(Level) = TotalString;
// Рекурсивный вызов построения дерева для всех дочерних узлов
for (var i = 0; i Item.Count; i++) {
BuildTree(Level, Item.Items(i), Value);
}
// Переход на уровень вверх в дереве после завершения обхода
// текущего узла
Level--;
// Вывод сообщения о завершении обхода дерева
if (Level 0) {
ShowMessage("Обход дерева узлов завершен.");
}
}
Но не получается вытянуть само значение, которое расположено между скобками, т.к. код var fioValue = StorageNode.GetChildNode('record').GetChildNode('fio').Text;
выводит все полностью, еще и с неправильной кодировкой:
"
Подскажите пожалуйста с помощью какого метода можно корректно вытянуть значения параметров fio, company...
Еще вопрос по поводу закрытия вызываемого окна, в скрипте
Self.Close();
}
Выдает ошибку:
TSDskWindowLibrary.DskWindow: Cannot change Visible in OnShow or OnHide
Заранее спасибо!
Нравится
Добрый день, Сергей!
Обратите, пожалуйста, внимание на текущую версию примера для работы с XML тут: http://terrasoft.com.ua/sdk/ пример IXMLStorageExample.js
Пример существенно отличается от представленного выше.
Кстати, в представленном файле client.xml ошибка в строке с телефоном - пропущен символ "<"
Насчет корректного вытягивания значений - рекомендуется использовать функции SetAttributeAsStr() и GetAttributeAsStr(), а с помощью прямого обращения к ноде нужный текст получить не удалось.
Желаю успехов!
Добрый день! Так я именно с IXMLStorageExample.js и взял код, только у меня нет той части в которой создаются новые аттрибуты, т.к. они мне не нужны, пропущенный символ вставил(нечаянно стер когда рисовал семерки :) ), насчет функций SetAttributeAsStr() и GetAttributeAsStr() - так они же для вытягивания аттрибутов, т.е. тех данных которые находятся непосредственно внутри скобок, например для записи
<record tel=77777777>
аттрибутом является tel, но у меня запись вида
<tel>7777777<tel>
:(
P.S> а что насчет ошибки с закрытием окна?
Спасибо! :)
Нашел решение! Привожу пример, может кому-то еще понадобиться извлечь данные из xml:
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); function loadXML(xmlFile) { xmlDoc.async="false"; xmlDoc.onreadystatechange=verify; xmlDoc.load(xmlFile); xmlObj=xmlDoc.documentElement; } function verify() { // 0 Object is not initialized // 1 Loading object is loading data // 2 Loaded object has loaded data // 3 Data from object can be worked with // 4 Object completely initialized if (xmlDoc.readyState != 4) { return false; } } loadXML('C:\client2.xml'); var fio = xmlObj.childNodes(0).childNodes(0).firstChild.text; var company = xmlObj.childNodes(0).childNodes(1).firstChild.text; var position = xmlObj.childNodes(0).childNodes(2).firstChild.text; var tel = xmlObj.childNodes(0).childNodes(3).firstChild.text; var email = xmlObj.childNodes(0).childNodes(4).firstChild.text; var country = xmlObj.childNodes(0).childNodes(5).firstChild.text; var city = xmlObj.childNodes(0).childNodes(6).firstChild.text; var address = xmlObj.childNodes(0).childNodes(7).firstChild.text;
более подробно можно почитать тут: http://www.codetoad.com/xml_javascripti_tutorial.asp
P.S> С закрытием окна так и не разобрался :(
все равно выдает ошибку..
Рад что требуемое решение найдено.
Про закрытие окна описано тут: http://community.terrasoft.ua/forum/topic/1989#comment-6640
Желаю успехов!