v7: Работа с MsXML из 7.7 через DOM #810216


#0 by MWWRuza
Такая конструкция:           Получаю коллекцию пространств имен, из пяти элементов: XML_DOM.Namespaces.Length = 5      По индексу получаю URL пространства имен: Ns = ";      Вопрос - как получить из этой коллекции префикс для этого пространства имен - ??? Ни один метод не работает, возвращает ошибку... Это вообще, возможно?
#1 by big
nodeName Содержит полное имя данного узла, включая префикс пространства имён. Только чтение. baseName Содержит имя данного узла без префикса пространства имён. Только чтение. prefix Содержит префикс (пространства имён) имени данного узла. Только чтение.
#2 by MWWRuza
Это я понимаю, и постоянно использую... Только в моем вопросе, "Namespaces" это не узел, это пространство имен - я толком не пойму, что это с точки зрения доступа к нему(свойство, атрибут или еще что-то - ???). Объясню подробнее. Во всей своей конфе, я во многих местах парсю XML используя: XML_DOM.selectSingleNode("./"префикс":"ИмяУзла"). Нет проблем, все работает отлично, пока какой-нибудь "извращенец", от которого я получаю XML, не использует свое, произвольно им придуманное имя префикса, отличное от стандартного. Ладно, не проблема, он его по любому, по правилам XML, объявляет в начале файла, в месте, где объявляется пространство имен. Не вопрос, написал функцию, которая вытаскивает пространства имен вместе с префиксами из атрибута корневого узла "Documents", помещает в таблицу, где путем сравнивания по URL пространства имен, получает таблицу соответствия "стандартного" и "извращенного" префикса. Из нее, я получаю нужные мне имена префиксов для парсинга DOMа, с нестандартными префиксами. Все работает, УРА!!! Я уже обрадовался... Но, тут оказалось, что некоторые "издатели" XML, решили поиздеваться еще дальше... Объявляют в начале XML, как атрибут корневого узла "Dokuments", не все NS, а только часть из них(2 первых). Дальнейшее объявление NS идет в теле XML, перед их использованием... В принципе, не запрещено... Но, я то их пытаюсь получить из атрибутов корневого узла!(а их там нет...). Я уже собрался писать функцию, которая распарсит весь XML, выберет из него все атрибуты с именем "xmlns", со всех строк, где они есть, поместит в ТЗ, свернет, и далее как всегда... Но, наткнулся на (свойство? функцию?) "Namespaces", которая возвращает коллекцию пространств имен... При этом, сами пространства, в виде URL, я получаюиз нее по индексу - XML_DOM.Namespaces(IndNs - 1), но мне этого не достаточно - мне еще нужен префикс... Как его получить?
#3 by MWWRuza
В общем, не получилось ничего "малой кровью"... Пришлось решить задачу "в лоб". Сначала, с помощью рекурсивной процедуры пробегаю по всей XML, получаю из нее пространства имен для всех узлов(отдельно префиксы и URL), выгружаю в таблицу, сворачиваю, что-бы не было лишних одинаковых строк. Получаю из XML описания все пространства имен со стандартными префиксами. В первую таблицу дописываю стандартные префиксы из второй(сопоставляю по URL NS), и после, уже как обычно - там, где в тексте программы, мне нужно получить доступ к узлу с нестандартным префиксом, я специальной функцией получаю его из этой таблицы, по "стандартному", который ожидался на этом месте. Получилась очень универсальная процедура чтения ЕГАИС-овских  XML, которой пофигу все извращения их создателей, глотает все, независимо от префиксов с мест объявления NS - хоть только в начале все, хоть перед каждой строкой... Все работает отлично, но осталось какое-то ощущение, что можно было проще сделать, но, как не знаю...
#4 by big
Да уж... Жить захочешь и не так раскорячишься (с) ))
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С