[РЕШЕНО] 1с 7.7, чтение XML, кодировка (utf-8 VS windows-1251)

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем ProfforG, 16 июн 2016.

  1. TopicStarter Overlay
    ProfforG
    Offline

    ProfforG Опытный в 1С

    Регистрация:
    31 окт 2011
    Сообщения:
    139
    Симпатии:
    1
    Баллы:
    29
    Всем доброго времени суток!

    Задачка: Необходимо получить из post-запроса геокоординаты.

    Получаю по api яндекса ответ, сохраняю в xml-файл (работает),
    загружаю этот файл и уже работаю с ним по геокоординатами после (не работает).

    Файл сохраняется в кодировке utf-8.

    код для загрузки v7plus.dll и addin.xmlparser, работа с файлом непосредственно:

    Код:
    Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда
                 Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "ExtForms\" + "v7plus.dll") <> 1 Тогда
                     Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "v7plus.dll") <> 1 Тогда
                         Предупреждение("Компонента v7plus.dll не найдена!");
                         Возврат;
                     КонецЕсли;
                 КонецЕсли;
             КонецЕсли;
          
             Анализатор = СоздатьОбъект("AddIn.XMLParser");
          
             XML_Документ = Анализатор.СоздатьДокумент();
             Если ПустоеЗначение(XML_Документ) = 1 Тогда
                 Возврат;
             Иначе
                 XML_Документ.Загрузить(ИмяПути+ИмяФайла);
                УзелPos = XML_Документ.ВыбратьУзел("pos");
                Сообщить(УзелPos.Значение);
             КонецЕсли;
    Если файл оставляю в этой кодировке (utf-8), то при обработке файла возникает ошибка:

    An invalid character was found in text content

    Если же я после получения файла-ответа, меняю кодировку с utf-8 на windows-1251, то возникает ошибка:

    Значение не представляет агрегатный объект (Значение)

    В первом случае ошибка понятна: там русский текст есть в файле ответа... а во втором случае - библиотека работает с xml только в utf-8???

    Как тогда получить мне значение узла? Помогите пожалуйста советом... может кто-то сталкивался

    Вложения:

    Последнее редактирование: 16 июн 2016
  2. TopicStarter Overlay
    ProfforG
    Offline

    ProfforG Опытный в 1С

    Регистрация:
    31 окт 2011
    Сообщения:
    139
    Симпатии:
    1
    Баллы:
    29
    Товарищи, может кто сможешь чем помочь всё-таки?

    Если у меня вложенных узлов нет в xml и я обращаюсь к узлу, то всё гуд, если я создаю на основании подчинённых, ты сыпятся ошибки...

    как дойти до вложенного узла? рисую такой код...:

    Код:
    Анализатор = СоздатьОбъект("AddIn.XMLParser");
    XML_Документ = Анализатор.СоздатьПоследовательноСчитываемыйДокумент();
    XML_Документ.СвязатьСФайлом(ИмяПути+ИмяФайла);
           
            ТипТега = XML_Документ.Спуститься();
            Пока ТипТега <> 4 Цикл
                Если ТипТега <> 1 Тогда
                    ТипТега = XML_Документ.Следующий();
                    Продолжить;
                КонецЕсли;
               
                ИмяТега = XML_Документ.СвойстваТекущегоУзла.Имя;
                Сообщить(ИмяТега);
                Если Нрег(СокрЛП(ИмяТега)) = "ymaps" Тогда
                    XML_Документ.Спуститься();
                    ИмяТега = XML_Документ.СвойстваТекущегоУзла.Имя;
                    Сообщить(ИмяТега);
                    Если Нрег(СокрЛП(ИмяТега)) = "GeoObjectCollection" Тогда
                        XML_Документ.Спуститься();
                        ИмяТега = XML_Документ.СвойстваТекущегоУзла.Имя;
                        Сообщить(ИмяТега);
                        Если Нрег(СокрЛП(ИмяТега)) = "featureMember" Тогда
                            XML_Документ.Спуститься();
                            ИмяТега = XML_Документ.СвойстваТекущегоУзла.Имя;
                            Сообщить(ИмяТега);
                            Если Нрег(СокрЛП(ИмяТега)) = "GeoObject" Тогда
                                XML_Документ.Спуститься();
                                ИмяТега = XML_Документ.СвойстваТекущегоУзла.Имя;
                                Сообщить(ИмяТега);
                                Если Нрег(СокрЛП(ИмяТега)) = "Point" Тогда
                                    XML_Документ.Спуститься();
                                    ИмяТега = XML_Документ.СвойстваТекущегоУзла.Имя;
                                    Сообщить(ИмяТега);
                                    Если Нрег(СокрЛП(ИмяТега)) = "pos" Тогда
                                        ИмяТега = XML_Документ.СвойстваТекущегоУзла.Имя;
                                        Сообщить(ИмяТега);
                                    Иначе
                                        ТипТега = XML_Документ.Следующий();
                                    КонецЕсли;
                                Иначе
                                    ТипТега = XML_Документ.Следующий();
                                КонецЕсли;
                            Иначе
                                ТипТега = XML_Документ.Следующий();
                            КонецЕсли;
                        Иначе
                            ТипТега = XML_Документ.Следующий();
                        КонецЕсли;
                    Иначе
                        ТипТега = XML_Документ.Следующий();
                    КонецЕсли;
                Иначе
                    ТипТега = XML_Документ.Следующий();
                КонецЕсли;
                ТипТега = XML_Документ.Следующий();
            КонецЦикла;
    считывается два узла, ymaps=>GeoObjectCollection (внутри у него еще два узла), но дальше не считывается узел featureMember
    Последнее редактирование: 21 июн 2016
  3. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    v7plus.dll - в топку. Используйте XMLDOM
    ProfforG нравится это.
  4. TopicStarter Overlay
    ProfforG
    Offline

    ProfforG Опытный в 1С

    Регистрация:
    31 окт 2011
    Сообщения:
    139
    Симпатии:
    1
    Баллы:
    29
    где её взять библиотеку (XMLDOM) и с чем её есть? мануал к 1с для него...хотя бы...
    --- Объединение сообщений, 22 июн 2016 ---
    вроде нашёл пару ссылок, но если есть полезная информация - лишней не будет. Заранее спасибо!

    Как сделаю, выложу код для будущих поколений))))
    Последнее редактирование: 22 июн 2016
  5. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    скинул в личку еще :)
  6. TopicStarter Overlay
    ProfforG
    Offline

    ProfforG Опытный в 1С

    Регистрация:
    31 окт 2011
    Сообщения:
    139
    Симпатии:
    1
    Баллы:
    29
    как и обещал, в результате получил координаты геопозиции для последующего использования:

    Код:
    XML_Документ = СоздатьОбъект("MSXML2.DOMDocument.4.0");
    XML_Документ.Load(ИмяПути+ИмяФайла);
    
    УзелYmaps = XML_Документ.DocumentElement;
               
    УзелGeoObjectCollection = УзелYmaps.LastChild;
                         
    УзелfeatureMember = УзелGeoObjectCollection.childNodes.item(1);
              
    УзелGeoObject = УзелfeatureMember.LastChild;
              
    УзелPoint = УзелGeoObject.childNodes.item(4);
              
    УзелPos = УзелPoint.LastChild;
          
    ПозицияРазделителя = Найти(УзелPos.Text," ");
    
    КоординатаДолгота = Число(Лев(УзелPos.Text,ПозицияРазделителя-1));
    КоординатаШирота = Число(Прав(УзелPos.Text,СтрДлина(УзелPos.Text)-ПозицияРазделителя));
    
    Огромное Вам человеческое спасибо, товарищи админы! с v7plus.dll такого варианта не прокатило.

    Тему можно закрывать =)
    alexburn нравится это.
Похожие темы
  1. Dmitrij

    Курилка Кодировка

    Dmitrij, 17 сен 2008, в разделе: Курилка
    Ответов:
    6
    Просмотров:
    1.449
  2. smolni
    Ответов:
    4
    Просмотров:
    2.175
Загрузка...

Поделиться этой страницей