#0
by antgenp
Добрый день! Есть задача - считывание xml-файлика. Она была реализована через анализатор XML v7plus.dll. Но, как оказалось, сервер пропускает и обрабатывает ответы с различными пространствами имен в файлах XML. Т.е. пространство имён может быть пустым, может быть "ns:", может быть "ns6", - и это только то, что реально попадается. Соответственно, реализация, где узел выбирался по каноническому имени (КорневойЭлемент.ВыбратьУзел("ns:НужныйУзел")) сработает только при полном совпадении и имени узла, и пространства имен. Условие метода "ВыбратьУзел" пишется, как я понял, на XSLT(?), должно быть составлено в соответствии со стандартами XPATH. Поискал в интернете варианты, как это можно сделать - под саму 1с 7.7 не нашел реализаций, но нашел, например, в описании XPATH функцию local-name, которая возвращает имя узла без наименования пространства имен, т.е., казалось бы, как раз то, что нужно. Но, увы, никак не пойму, можно ли в условии выбора для метода 1с 7.7 "ВыбратьУзел" использовать предикат (условие). У меня, по крайней мере, не получилось. Пробовал, например, следующий вариант: ВыбратьУзел("./*[local-name='НужныйУзел']") 1С выдает ошибку: Ошибка исполнения метода. У меня вообще не получилось ни одну функцию XPATH засунуть в условие метода - всегда получал ошибку. Может быть, я что-то делаю не так, как нужно? Или есть какая-то другая возможность сделать потребное? Или нужно идти через объявление пространства имен? У меня пока остался единственный вариант - прописать все варианты через оператор логического или "|" : ВыбратьУзел("ns:НужныйУзел|ns6:НужныйУзел|НужныйУзел") Но со временем могут добавиться новые пространства имен, а каждый раз отслеживать и своевременно их добавлять проблемно. Можете помочь решить как-то проблему?
#1
by antgenp
Делается это для ЕГАИС, проблемы обнаружилась в актах от клиентов. Примеры файликов: <ns:Documents xmlns:ns="; <Identity xmlns="; <ns:Documents xmlns:xsi="; xmlns:ns="; xmlns:oref="; xmlns:pref="; xmlns:wa="; Version="1.0"> <ns:Owner>
#2
by antgenp
АП Приношу свои извинения за форматирование примеров - если подскажите, как пост можно отредактировать, исправлюсь. Ещё раз вкратце проблема: Приходят XML с одними и теми же собственными именами узлов, но разными пространствами имен. В остальном всё то же самое. Пример: <Header></Header> Могу я с помощью метода ВыбратьУзел v7plus.dll в 1с 7.7 выбрать узел с наименованием Header без оглядки на пространство имен? Или в какую сторону идти курить мануалы?
#5
by antgenp
Не выходит. Выдает ошибку: msxml3.dll: Ключевое слово "xsl:stylesheet" не может содержать узлы "PCDATA".
#6
by antgenp
Погуглил, нашел немного другой вариант: Сейчас тестирую, пока похоже, что работает так, как мне надо. Но, т.к. XSLT не знаю, то пока не уверен в этом ) Спасибо за помощь.
#7
by Djelf
Ну я тоже не сам это преобразование придумал. Странно... это выдернуто из рабочего модуля егаис, хотя для такой ошибки достаточно того чтобы одна буковка не так скопировалась.
#8
by antgenp
А рабочий модуль для семерки или для восьмерки? У меня ещё были проблемы с любыми упоминаниями кодировки. Ошибка была что-то вроде "Недопустимая кодировка" или как-то так,при чем пробовал менять указанную кодировку, ставил вариант с кодировкой из вашего примера, но ошибка всё равно сохранялась. Пришлось убрать все упоминания о кодировке. А может быть это из-за различных версий платформы 1с?
#9
by Djelf
Ну раз в коде СоздатьОбъект то 7ка. Ты случаем в функцию не текст передашь? Туда MSXML2.DOMDocument передавать надо.
#10
by antgenp
Нет, не текст, но и не MSXML2.DOMDocument, а объект, загруженный с помощью анализатора XML v7plus.dll. У меня всё было под него написано, поэтому, возможно, и не сработал твой пример. С другой стороны, тот вариант, который я тебе написал, вроде работает и таким образом. Получается, что у меня сейчас создается объект анализатора XML, потом я его передаю в функцию, функция возвращает элемент MSXML2.DOMDocument, продолжать работу с ним анализатор не может, поэтому его приходится снова открывать анализатором, благо в параметр анализатора можно как писать имя файла на диске, так и объект. Выглядит это так: ПарсерХМЛ = СоздатьОбъект("AddIn.XMLParser"); Если можно сделать лучше или это дикая ересь, то подскажи как исправить, пожалуйста. Просто изначально всё было написано под анализатор, а таким образом получилось сделать с минимумом изменений.
#11
by antgenp
Если я правильно понимаю, анализатор XML v7plus.dll тоже работает через MSXML, но может не совпадать версия - сейчас глянул какие версии используются - ВерсияАнализатора 2.0, ВерсияБазовогоАнализатора 3.0. Из этого мне не совсем понятно, MSXML2 или MSXML3 используется компонентой v7plus.dll, может быть проблема была в том, что всё-таки используется версия 3.0 а я её передавал в функцию для обработки 2-й версией. Соответственно, возникали ошибки из-за какого-то различия в понимании синтаксиса.
#12
by trad
не нужно делать никакой обработки xml, ни выпиливание ns, ни xslt-преобразований, ни поиска по подстроке. Нужно просто обучить свой DOMDocument. Сказать ему под каким псевдонимом ты ожидаешь увидеть каждый URI В твоем случае делается это так: И далее везде в коде работаешь через упомянутый wa
#13
by trad
А в целом, для работы с УТМ ЕГАИС у меня есть такая функция, где перечислены все используемые в УТМ URI и их типовые псевдонимы: |xmlns:wb='' |xmlns:tc='' |xmlns:wa='' |xmlns:ctc='' |xmlns:ain='' |xmlns:ainp='' |xmlns:qp='' |xmlns:wbr='' |xmlns:aint='' |xmlns:qf='' |xmlns:awr='' |xmlns:rpp='' |xmlns:rpi='' | |xmlns:rssp='' |xmlns:rs='' |xmlns:rc='' |xmlns:rap='' |xmlns:rst='' |xmlns:rfa='' |xmlns:rfb='' | |xmlns:rfhb='' |xmlns:orefv='' | |xmlns:oref2='' |xmlns:pref2='' |xmlns:qrrp='' |xmlns:qrri='' | |xmlns:rssp2='' |xmlns:rs2='' |xmlns:rc2='' |xmlns:rap2='' |xmlns:rst2='' |xmlns:rfa2='' |xmlns:rfb2='' |xmlns:rfhb2='' |xmlns:wb2='' |xmlns:wa2='' |xmlns:ainp2='' |xmlns:wbr2='' |xmlns:aint2='' |xmlns:qf2='' |xmlns:awr2='' |xmlns:tfs='' |xmlns:tts='' |xmlns:ripf1='' |xmlns:nattn='' |xmlns:rsts2='' |xmlns:asiu='' |xmlns:asiut='' | |xmlns:ains2='' |xmlns:awrs2='' |xmlns:wbfu='' |xmlns:qbc='' |xmlns:rbc='' |xmlns:rrwb='' |xmlns:crwb='' |xmlns:rraco=''
#14
by trad
получить актуальный список пространств имен можно в УТМ, в документе WB_DOC_SINGLE_01.xsd
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- v7: v7 : НДС при возврате
- v7: Что нужно чтоб подключить ККМ Меркурий 112F к 1с V7 Торговля + склад
- v7: v7.7 премещение элемента справочника
- v7: 1С v7.7 Бух учет (получить остаток по складам)
- v7: v8: v7: Кто-нибудь сумел скачать комплект отчетности за I квартал 2007 года
- Выбрать узел XML по его значению
- Как при работе с XDTO в xml файле убрать вывод пространства имен
- v7: Как ввести в 1С V7.7 пособие на погребение?
- v7: 1С V7.7 в сети
- v7: 1C:V7 starter program (for SQL) - обнаружена ошибка
- v7: commerceML offers.xml import.xml
- v7: Помогите с компонентой V7 plus работа с XML
В этой группе 1С
- Интерфейс ТСД на УФ
- Классификатор стран мира.
- 1С Розница декалитры в литры
- Номер сеанса 1С для текущего пользователя
- СКД слетает макет оформления при создании формы
- "Файловая база" vs PostgreSQL
- 1С Розница 2+1
- v7: 1с++ условие на документ неопределенного вида при запросе к регистру как?
- Как вывести значение отдельной колонкой в Универсальном отчете
- В СКД вывести номер группировки первой колонкой
- Интерактивные операции не доступны
- УПП Распределение общепроизводственной затраты
- Обмен данными из КА 1.1 в БП 3.0 - как делали?
- БП 3.0 (3.0.44.94)
- Синхронизация ЗУП Базовый - БП КОРП
- v7: v7 Нотификатор событий 1С
- Задваиваются остатки в 1С "УТ"
- ЗУП 3.0 Стоимость часа для ночных
- В чем смысл свертки базы, подскажите.
- Документооборот. Уведомления о просроченных задачах.