Цитата: MWWRuza ➤ я готов выложить фрагменты кода(1с7.7), которые этим занимаются
Вот:
В глобальном модуле:
Объявляется переменная:
Перем ТабПреф Экспорт; // Влад 08.12.2017 Таблица соответствия префиксов от "извращенцев" стандартным префиксам
В теле самого модуля, в конце, вне процедур:
// 08.12.2017 инициализация таблицы для работы с нестандартными префиксами от "извращенцев"
ТабПреф = СоздатьОбъект("ТаблицаЗначений");
ТабПреф.НоваяКолонка("СтПреф");
ТабПреф.НоваяКолонка("НовПреф");
ТабПреф.НоваяКолонка("URL");
ТабПреф.НоваяКолонка("Сверт");
// Влад
Процедуры и функции глобального модуля:
Функция ПолучитьТзСтандартныхПрефиксов()
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("СтПреф");
ТЗ.НоваяКолонка("URL");
ОП = глЗначениеПоУмолчанию("ОсновнаяФирма").ЮрЛицо;
УТМ_URL = СокрЛП(ОП.УТМ_URL);
URL = УТМ_URL + "info/xsdWholesale/WEGAIS/WB_DOC_SINGLE_01.xsd"; // URL Схемы документов XSD
Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="vbscript";
Это = Скрипт.Eval("this");
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Скрипт.AddObject("WinHttp",WinHttp);
WinHttp.Open("GET", URL, 0);
Попытка
WinHttp.Send();
Исключение
Сообщить("Служба УТМ не запущена, невозможно получить список входящих документов!");
Возврат "";
КонецПопытки;
Если WinHTTP.Status<>200 Тогда
Предупреждение("Не удалось загрузить документ. Возможно он удалён или служба УТМ не запущена.");
Возврат "";
КонецЕсли;
Стрим = СоздатьОбъект("ADODB.Stream");
Стрим.Mode = 3;
Стрим.Type = 1;
Стрим.Open();
Скрипт.AddObject("Stream",Стрим);
XML_DOM=CreateObject("MSXML2.DOMDocument.6.0");
Скрипт.Eval("Stream.Write(WinHttp.responseBody)");
Стрим.Position = 0;
Стрим.Type = 2;
Стрим.Charset = "utf-8";
Ответ = Стрим.ReadText();
Стрим.Close();
НачТела = Найти(Ответ,"<pre>");
Ответ = Сред(Ответ,НачТела);
КонТела = Найти(Ответ,"</pre>") + 5;
Ответ = Лев(Ответ,КонТела);
XML_DOM.LoadXML(Ответ);
NamRootNodSchem = XML_DOM.DocumentElement.selectSingleNode("/*").NodeName;
СтрСхем = XML_DOM.selectSingleNode(NamRootNodSchem).text;
Пока Найти(СтрСхем,"xmlns:") > 0 Цикл
ОстСтр = Сред(СтрСхем,Найти(СтрСхем,"xmlns:") + 6);
НачАдреса = Найти(ОстСтр,"=");
ТекПреф = Лев(ОстСтр,НачАдреса - 1);
ТекПреф = СтрЗаменить(ТекПреф,"2","");
ТекПреф = СтрЗаменить(ТекПреф,"3","");
ОстСтр = Сред(ОстСтр,НачАдреса + 2);
КонАдреса = Найти(ОстСтр,"""") - 1;
ТекАдрес = Сред(ОстСтр,1,КонАдреса);
СтрСхем = ОстСтр;
ТЗ.НоваяСтрока();
ТЗ.СтПреф = ТекПреф;
ТЗ.URL = ТекАдрес;
КонецЦикла;
ТЗ.Сортировать("СтПреф, URL");
Возврат ТЗ;
КонецФункции
Функция ТекПреф(СтПр) Экспорт
ТекСтрСоот = "";
ТекПреф = "";
Если ТабПреф.НайтиЗначение(СтПр,ТекСтрСоот,"СтПреф") = 1 Тогда
ТекПреф = ТабПреф.ПолучитьЗначение(ТекСтрСоот,"НовПреф");
КонецЕсли;
Возврат ТекПреф;
КонецФункции
Процедура ЗаполнитьТабПростИмен(nod) // Рекурсивная процедура, пробегает по всему DOM и вытаскивает из него прециксы и URL_NS в ТЗ.
ИмяПреф = nod.prefix;
URL_NS = nod.namespaceURI;
Если СокрЛП(ИмяПреф) <> "" Тогда
ТабПреф.НоваяСтрока();
ТабПреф.НовПреф = ИмяПреф;
ТабПреф.URL = URL_NS;
ТабПреф.Сверт = 1;
КонецЕсли;
node = nod.childNodes;
Ind = 0;
Для Ind = 1 По node.Length Цикл
ChildNod = node.item(ind - 1);
ИмяПреф = ChildNod.prefix;
URL_NS = ChildNod.namespaceURI;
Если СокрЛП(ИмяПреф) <> "" Тогда
ТабПреф.НоваяСтрока();
ТабПреф.НовПреф = ИмяПреф;
ТабПреф.URL = URL_NS;
ТабПреф.Сверт = 1;
КонецЕсли;
ЗаполнитьТабПростИмен(ChildNod);
КонецЦикла;
КонецПроцедуры
Во всех остальных модулях, где нужно получить что-либо из файла XML:
Например:
DocumentNode = XML_DOM.selectSingleNode("/" + ТекПреф("ns") + ":Documents/" + ТекПреф("ns") + ":Document").firstChild;
Вызывается функция ТекПреф("СтПреф"), где "СтПреф" - стандартный префикс, который ожидается на этом месте, из мануала. Функция возвращает соответствующий ему "извращенный", из заголовка файла, где объявляются пространства имен.
В результате, префиксы могут быть любыми, но, по правилам языка XML они должны быть объявлены, вместе с URL пространств имен.