Данные из xml файла

Добрый день! Нашел в SDK скрипт по работе с xml файлом.
Имеется xml файл (client.xml), который имеет следующий вид:

xml version="1.0" encoding="Windows-1251"?>
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 скрипт закрытия окна - так как это было уже описано на форуме:

function wnd_UrlOnPrepare(Window) {
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...
Еще вопрос по поводу закрытия вызываемого окна, в скрипте
function wnd_UrlOnShow(Window) {
     Self.Close();
}

Выдает ошибку:
TSDskWindowLibrary.DskWindow: Cannot change Visible in OnShow or OnHide

Заранее спасибо!

Нравится

4 комментария

Добрый день, Сергей!

Обратите, пожалуйста, внимание на текущую версию примера для работы с 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
Желаю успехов!

Показать все комментарии