5.
lsp71
27.02.12 12:33
Сейчас в теме
Для начинающих изучать XML. Для чтения из XML-файлов использую функцию ПрочитатьXMLфайл(ФайлХМЛ), преобразующую такой файл в ДеревоЗначений. А дальше непосредственно нужные данные из него читаю функцией ПолучитьЗначПарам(ИмяПараметра, Дерево). Назначение параметров и их типы понятны из комментариев. Просто и надежно.
Функция ПрочитатьXMLфайл(ФайлХМЛ) Экспорт ////////////////////////////////////////////////////////////////////
// Ф-я возвращает ДеревоЗначений, прочитанное из XML-файла
//создаем ДЗн с нужными колонками:
дзДеревоХМЛ = Новый ДеревоЗначений;
дзДеревоХМЛ.Колонки.Добавить("ИмяПарам");
дзДеревоХМЛ.Колонки.Добавить("ЗначПарам");
//проверка существования файла:
Если НЕ ФайлХМЛ.Существует() Тогда
Сообщить("ПрочитатьXMLфайл: файл '" + ФайлХМЛ.ПолноеИмя + "' не существует!", СтатусСообщения.Важное);
отказ = Истина;
Возврат дзДеревоХМЛ; //возвращаем пустое ДЗн
КонецЕсли; //НЕ Файл.Существует()
Попытка
объектХМЛ = Новый ЧтениеXML();
объектХМЛ.ОткрытьФайл(ФайлХМЛ.ПолноеИмя); //открываем xml-файл для чтения
Исключение
Сообщить("Не удалось открыть для чтения файл '" + ФайлХМЛ.ПолноеИмя + "'", СтатусСообщения.Важное);
Возврат дзДеревоХМЛ; //возвращаем пустое ДЗн
КонецПопытки;
//------------------------------ читаем данные из XML-файла в ДеревоЗначений ---------------------------------
текСтроки = дзДеревоХМЛ.Строки;
Пока объектХМЛ.Прочитать() Цикл
Если объектХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
текСтрока = текСтроки.Добавить();
текСтрока.ИмяПарам = объектХМЛ.Имя;
текСтроки = текСтрока.Строки;
ИначеЕсли объектХМЛ.ТипУзла = ТипУзлаXML.Текст Тогда
Попытка
текСтроки.Родитель.ЗначПарам = ЗначениеИзСтрокиВнутр(объектХМЛ.Значение);
Исключение
текСтроки.Родитель.ЗначПарам = объектХМЛ.Значение;
КонецПопытки;
ИначеЕсли объектХМЛ.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Если текСтроки.Родитель.Родитель = Неопределено Тогда
текСтроки = текСтроки.Родитель.Строки;
Иначе
текСтроки = текСтроки.Родитель.Родитель.Строки;
КонецЕсли; //текСтроки.Родитель.Родитель = Неопределено
КонецЕсли; //объектХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента
Пока объектХМЛ.ПрочитатьАтрибут() Цикл
текСтрока = текСтроки.Добавить();
текСтрока.ИмяПарам = объектХМЛ.Имя;
текСтрока.ЗначПарам = объектХМЛ.Значение;
КонецЦикла; //Пока объектХМЛ.ПрочитатьАтрибут() Цикл
КонецЦикла; //Пока объектХМЛ.Прочитать() Цикл
объектХМЛ.Закрыть(); //закрываем открытый для чтения xml-файл
Возврат дзДеревоХМЛ; // возвращаем ДЗн с данными
КонецФункции // ПрочитатьXMLфайл(Файл) ///////////////////////////////////////////////////////////////////////
функция ПолучитьЗначПарам(ИмяПараметра, Дерево) Экспорт //////////////////////////////////////////////////////
// Ф-я возвращает зн-е из колонки "ЗначПарам" строки ДЗн, в кот. в колонке "ИмяПарам" содержится ИмяПараметра.
//ИмяПараметра - строка - название того параметра, кот. надо извлечь.
//Дерево - ДЗн или строка ДЗн, в кот. надо искать. Если задана строка ДЗн, то поиск происходит только в ее пределах
//(только ей подчиненные строки).
// Если зн-е не найдено, то ф-я возвращает Неопределено.
Попытка
стрДЗ = Дерево.Строки.Найти(ИмяПараметра,"ИмяПарам", Истина);
Если стрДЗ <> Неопределено Тогда
Возврат СтрДЗ.ЗначПарам;
Иначе
Возврат Неопределено;
КонецЕсли; //стрДЗ <> Неопределено
Исключение
Возврат Неопределено; //в случае любой ошибки выполнения (например, Дерево не является ДЗн или строкой ДЗн)
КонецПопытки;
КонецФункции //ПолучитьЗначПарам(ИмяПараметра, Дерево) Экспорт ///////////////////////////////////////////////