v7: Как выбрать узел XML по неполному имени (без пространства имен)? #779412


#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 без оглядки на пространство имен? Или в какую сторону идти курить мануалы?
#3 by Djelf
Можно убрать все пространства имен и работать без них.
#4 by antgenp
Спасибо, сегодня попробую.
#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
#15 by sapphire
Используйте Microsoft DOM Document.
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям