Чтение созданного файла xml.

1. slim747 17.10.21 15:19 Сейчас в теме
Добрый день программисты. Есть проблема. Вкратце. Через Winhttp.WinhttpRequest5.1 отправляю запрос на сервер и получаю результат в Winhttp.ResponseText. Получается безразмерная строка. Преобразовываю в xml через Adodb.Stream.
Далее проблема. Полученный файл не могу прочитать. Использую объект AddIn.XMLParser. при чтении первого узла ошибка исполнения метода.
Понимаю что описание расплывчатое но может кто сталкивался. Стопудов какая то мелочь.
Xml которые приходят со стороны грузятся без вопросов.
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. DenisCh 17.10.21 16:03 Сейчас в теме
Я могу ошибаться, но может, у стрима есть статус, что он закончил записываться?
А ты пытаешься читать файл, который ещё в процессе?
3. slim747 17.10.21 16:34 Сейчас в теме
(2)Я его могу открыть и посмотреть содержимое. Файл как файл. Формата хмл. Только в самой верхней строке отсутствует параметр encoding. Я так понял это кодировка. Все файлы которые читались были с кодировкой utf-8. Пробовал в параметр CHARSET объекта AdodbStream писать ''utf-8''. Один фиг не хочет и в файле не указан парметр.
4. dvk09 2 18.10.21 04:29 Сейчас в теме

//{Процедуры и функции для работы с XML

//==========================================================­============
Функция УдалитьСимволыПереносаСтроки(СтрокаТекста)
	СтрокаТекста = СтрЗаменить(СтрокаТекста, Симв(10), "");
	СтрокаТекста = СтрЗаменить(СтрокаТекста, Симв(13), "");
	Возврат СтрокаТекста;
КонецФункции // УдалитьСимволыПереносаСтроки(СтрокаТекста)
//==========================================================­============
Процедура ДобавитьАтрибут(ДОМ, ЭлементДом, НазваниеАтрибута, ЗначениеАтрибута)
	Перем Атрибут;
	Атрибут = ДОМ.createAttribute(НазваниеАтрибута);
	Атрибут.nodeValue = "" + ЗначениеАтрибута;
	ЭлементДом.setAttributeNode(Атрибут);
КонецПроцедуры // ДобавитьАтрибут
//==========================================================­============
Процедура ДобавитьУзелИнструкцииПоОбработке(ДОМ, НазваниеУзла = "xml", ЗначениеУзла = "version=""1.0"" encoding=""windows-1251""")
	Перем УзелИнструкцииПоОбработке;
	УзелИнструкцииПоОбработке = ДОМ.createProcessingInstruction(НазваниеУзла, ЗначениеУзла); //windows-1251
	ДОМ.appendChild(УзелИнструкцииПоОбработке);
КонецПроцедуры // ДобавитьУзелИнструкцииПоОбработке
//==========================================================­============
Функция ДобавитьУзел(ДОМ, ИмяУзла, Родитель, Знач ТекстУзла = "", ЭтоЧисло = 0)
	Перем Узел;
	Если ЭтоЧисло = 1 Тогда
		ТекстУзла = СтрЗаменить(Строка(ТекстУзла), ",", ".");
	КонецЕсли;
	Узел = ДОМ.createElement(ИмяУзла);
	Если ТекстУзла <> "" Тогда
		Узел.Text = УдалитьСимволыПереносаСтроки(ТекстУзла);
	КонецЕсли;
	Родитель.appendChild(Узел);
	Возврат Узел;
КонецФункции // ДобавитьУзел
//==========================================================­============
Функция ВернутьДОМ(СтрокаXML = "")
	
	Попытка
		ДОМ = CreateObject("Msxml2.DOMDocument.6.0");
	Исключение
		ДОМ = CreateObject("Msxml2.DOMDocument");
	КонецПопытки;
	ДОМ.async = 0;
	ДОМ.resolveExternals = 0; 
	ДОМ.validateOnParse = 0;
	
	Если СтрокаXML = "" Тогда
		Возврат ДОМ;
	КонецЕсли;
	
	Если ТипЗначенияСтр(СтрокаXML)="СписокЗначений" Тогда
		Попытка
			ДОМ.load(СтрокаXML.ПолучитьЗначение(1));
			ДОМ.setProperty("SelectionLanguage", "XPath");
		Исключение
			Сообщить(ОписаниеОшибки());
			ДОМ = 0;
		КонецПопытки;
	ИначеЕсли ТипЗначенияСтр(СтрокаXML)="OLE.IXMLDOMElement" Тогда
		Попытка
			ДОМ.loadXML(СтрокаXML.text);
			ДОМ.setProperty("SelectionLanguage", "XPath");
		Исключение
			Сообщить(ОписаниеОшибки());
			ДОМ = 0;
		КонецПопытки;
	ИначеЕсли ТипЗначенияСтр(СтрокаXML)="OLE.IXMLDOMDocument3" Тогда
		Попытка
			ДОМ.loadXML(СтрокаXML.xml);
			ДОМ.setProperty("SelectionLanguage", "XPath");
		Исключение
			Сообщить(ОписаниеОшибки());
			ДОМ = 0;
		КонецПопытки;
	Иначе    
		Попытка
			ДОМ.loadXML(СтрокаXML);
			ДОМ.setProperty("SelectionLanguage", "XPath");
		Исключение
			Сообщить(ОписаниеОшибки());
			ДОМ = 0;
		КонецПопытки;
	КонецЕсли;
	
	
	Возврат ДОМ;
	
КонецФункции
//==========================================================­============
Процедура ДополнитьДОМ(ДОМ, ДопДОМ)
	Корень = ДОМ.lastChild;
	ДопКорень = ДопДОМ.lastChild;
	Узлы = ДопКорень.childNodes;
	КоличествоУзлов = Узлы.length - 1;
	Для НомерУзла = 0 По КоличествоУзлов Цикл
		Корень.appendChild(Узлы.item(0));
	КонецЦикла;
КонецПроцедуры // ДополнитьДОМ(ДОМ, ДопДОМ)
//==========================================================­============
Функция СохранитьXML(ДОМ, ИмяФайла = "")
	Если ИмяФайла = "" Тогда
		ИмяФайла = ПолучитьИмяВременногоФайла("xml");
	КонецЕсли;
	ДОМ.save(ИмяФайла);
	Возврат ИмяФайла;
КонецФункции // СохранитьXML(ДОМ, ИмяФайла = "")
//==========================================================­============
Процедура ПоказатьXML(ДОМ, ИмяФайла = "")
	ИмяФайла = СохранитьXML(ДОМ, ИмяФайла);
	ЗапуститьПриложение(СохранитьXML(ДОМ, ИмяФайла));
КонецПроцедуры // ПоказатьТокен
//==========================================================­============
Функция ПолучитьСтруктуруИзУзла(Узел)
	СтруктураУзла = СоздатьОбъект("Структура");
	Узлы = Узел.childNodes;
	Для НомерУзла = 0 По Узлы.length - 1 Цикл
		ДочернийУзел = Узлы.item(НомерУзла);
		СтруктураУзла.Вставить(ДочернийУзел.baseName, ДочернийУзел.text);
	КонецЦикла;
	Возврат СтруктураУзла;
КонецФункции // ПолучитьСтруктуруИзУзла(Узел)

//}

Показать
5. dvk09 2 18.10.21 04:33 Сейчас в теме
(4)
СоздатьОбъект("Структура")
- из 1cpp, можно заменить на список значений,
СтруктураУзла.Вставить(ДочернийУзел.baseName, ДочернийУзел.text); - при добавлении значения в список поменять местами ДочернийУзел.baseName и ДочернийУзел.text
6. dvk09 2 18.10.21 04:35 Сейчас в теме
(5) В общем с xml я обычно так работаю

Функция ВернутьДОМ(СтрокаXML = "") - где-то подсмотрел, возможно в обработка обмена с Audatex, возможно где-то тут. на форуме.
7. dvk09 2 18.10.21 04:39 Сейчас в теме
(6) Ну и
Winhttp.ResponseText
можно сразу отдать в ВернутьДОМ
8. slim747 18.10.21 10:45 Сейчас в теме
Благодарствую. Буду разбираться.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)