Как распарсить произвольный XML файл в 1С
По теме из базы знаний
Найденные решения
чтобы вот прямо любую xml подсунули и процедура вам правильно ее разобрала, это утопия, ИМХО
в любой xml есть структура - секции, теги, атрибуты, значения тегов или атрибутов
не зная структуры заранее нельзя разобрать ее правильно
вернее можно... но для этого в самой xml должно присутствовать описание типов значений атрибутов\тегов, чтобы понимать к каком типу все это дело приводить в 1С
можно, конечно, все в строку пихать, но потом все равно придется результат вручную обрабатывать скорее всего
вот так примерно можно прочитать можно любую xml (выдернуто из контекста, могут быть ошибки, но смысл должен быть понятен)
в любой xml есть структура - секции, теги, атрибуты, значения тегов или атрибутов
не зная структуры заранее нельзя разобрать ее правильно
вернее можно... но для этого в самой xml должно присутствовать описание типов значений атрибутов\тегов, чтобы понимать к каком типу все это дело приводить в 1С
можно, конечно, все в строку пихать, но потом все равно придется результат вручную обрабатывать скорее всего
вот так примерно можно прочитать можно любую xml (выдернуто из контекста, могут быть ошибки, но смысл должен быть понятен)
лДокументXML = СоздатьОбъект("MSXML2.DOMDocument.4.0");
лДокументXML.Load(ПолноеИмяФайлаXML);
// надо знать как минимум имя корневого узла в xml и имена секций объектов
// ИмяКорневогоУзлаXML
// ИмяТипаОбъектовXML
лКорневойУзел = лДокументXML.selectSingleNode(ИмяКорневогоУзлаXML);
лНаборОбъектовXML = лКорневойУзел.selectSingleNode(ИмяТипаОбъектовXML).childNodes();
Если лНаборОбъектовXML.Length() = 0 Тогда
Продолжить;
КонецЕсли;
Для лНомерОбъекта = 1 По лНаборОбъектовXML.length() Цикл
лОбъектXML = лНаборОбъектовXML.item(лНомерОбъекта - 1);
//реквизиты XML-объекта
лРеквизитыОбъектаXML = лОбъектXML.childNodes();
Для лНомерСвойства = 1 По лРеквизитыОбъектаXML.length() Цикл
лРеквизитОбъектаXML = лРеквизитыОбъектаXML.item(лНомерСвойства - 1);
лИмяРеквизитаXML = лРеквизитОбъектаXML.nodeName;
лЗначениеXML = лРеквизитОбъектаXML.text;
//реквизит XML-объекта
лНомерСтрокиРеквизита = "";
// знаем тип значения, приводим к известному типу лТипДанных
// не знаем тип значения, приведем к строке, например, лТипДанных = Строка(100)
лЗначениеРеквизита = ПривестиЗначениеКТипуИзXML(лЗначениеXML, лТипДанных);
//дочерний набор объектов XML-объекта
Если лРеквизитОбъектаXML.childNodes().length() <> 0 Тогда
лСЗнИменаДочернихТиповОбъектовXML.ДобавитьЗначение(лИмяРеквизитаXML);
Иначе
Продолжить;
КонецЕсли;
//дочерние типы XML-объектов
Для р = 1 По лСЗнИменаДочернихТиповОбъектовXML.РазмерСписка() Цикл
лИмяДочернегоТипаОбъектовXML = лСЗнИменаДочернихТиповОбъектовXML.ПолучитьЗначение(р);
лДочернийТипОбъектовXML = лОбъектXML.selectSingleNode(лИмяДочернегоТипаОбъектовXML);
лДочерниеОбъектыXML = лДочернийТипОбъектовXML.childNodes();
Для лНомерДочернегоОбъектаXML = 1 По лДочерниеОбъектыXML.length() Цикл
лДочернийОбъектXML = лДочерниеОбъектыXML.item(лНомерДочернегоОбъектаXML - 1);
лРеквизитыДочернегоОбъектаXML = лДочернийОбъектXML.childNodes();
Для лНомерДочернегоСвойства = 1 По лРеквизитыДочернегоОбъектаXML.length() Цикл
лИмяДочернегоРеквизитаXML = лРеквизитыДочернегоОбъектаXML.item(лНомерДочернегоСвойства - 1).nodeName;
лЗначениеДочернегоXML = лРеквизитыДочернегоОбъектаXML.item(лНомерДочернегоСвойства - 1).text;
//реквизит XML-объекта
// знаем тип значения, приводим к известному типу лТипДанных
// не знаем тип значения, приведем к строке, например, лТипДанных = Строка(100)
лЗначениеДочернегоРеквизита = ПривестиЗначениеКТипуИзXML(лЗначениеДочернегоXML, лТипДанных);
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Разбор XML документа - почти все возможные способы
----------------
(1) Все уже придумано до нас:
Ну и выдержка из СП:
ПрочитатьXML (ReadXML)
Синтаксис:
ПрочитатьXML(<ЧтениеXML>, <ТипЗначения>)
<ТипЗначения> (необязательный)
Тип: Тип.
Тип значения, которое должно быть прочитано из XML.
Если тип не указан, то будет произведена попытка определения типа значения непосредственно из представления XML.
Возвращаемое значение:
Тип: Значение считанного типа, Неопределено.
Описание:
Считывает значение в формате XML. Прочитаны могут быть значения тех типов, которые могут быть записаны методом ЗаписатьXML.
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Результат = ПрочитатьXML(ЧтениеXML);
Ну и выдержка из СП:
ПрочитатьXML (ReadXML)
Синтаксис:
ПрочитатьXML(<ЧтениеXML>, <ТипЗначения>)
<ТипЗначения> (необязательный)
Тип: Тип.
Тип значения, которое должно быть прочитано из XML.
Если тип не указан, то будет произведена попытка определения типа значения непосредственно из представления XML.
Возвращаемое значение:
Тип: Значение считанного типа, Неопределено.
Описание:
Считывает значение в формате XML. Прочитаны могут быть значения тех типов, которые могут быть записаны методом ЗаписатьXML.
чтобы вот прямо любую xml подсунули и процедура вам правильно ее разобрала, это утопия, ИМХО
в любой xml есть структура - секции, теги, атрибуты, значения тегов или атрибутов
не зная структуры заранее нельзя разобрать ее правильно
вернее можно... но для этого в самой xml должно присутствовать описание типов значений атрибутов\тегов, чтобы понимать к каком типу все это дело приводить в 1С
можно, конечно, все в строку пихать, но потом все равно придется результат вручную обрабатывать скорее всего
вот так примерно можно прочитать можно любую xml (выдернуто из контекста, могут быть ошибки, но смысл должен быть понятен)
в любой xml есть структура - секции, теги, атрибуты, значения тегов или атрибутов
не зная структуры заранее нельзя разобрать ее правильно
вернее можно... но для этого в самой xml должно присутствовать описание типов значений атрибутов\тегов, чтобы понимать к каком типу все это дело приводить в 1С
можно, конечно, все в строку пихать, но потом все равно придется результат вручную обрабатывать скорее всего
вот так примерно можно прочитать можно любую xml (выдернуто из контекста, могут быть ошибки, но смысл должен быть понятен)
лДокументXML = СоздатьОбъект("MSXML2.DOMDocument.4.0");
лДокументXML.Load(ПолноеИмяФайлаXML);
// надо знать как минимум имя корневого узла в xml и имена секций объектов
// ИмяКорневогоУзлаXML
// ИмяТипаОбъектовXML
лКорневойУзел = лДокументXML.selectSingleNode(ИмяКорневогоУзлаXML);
лНаборОбъектовXML = лКорневойУзел.selectSingleNode(ИмяТипаОбъектовXML).childNodes();
Если лНаборОбъектовXML.Length() = 0 Тогда
Продолжить;
КонецЕсли;
Для лНомерОбъекта = 1 По лНаборОбъектовXML.length() Цикл
лОбъектXML = лНаборОбъектовXML.item(лНомерОбъекта - 1);
//реквизиты XML-объекта
лРеквизитыОбъектаXML = лОбъектXML.childNodes();
Для лНомерСвойства = 1 По лРеквизитыОбъектаXML.length() Цикл
лРеквизитОбъектаXML = лРеквизитыОбъектаXML.item(лНомерСвойства - 1);
лИмяРеквизитаXML = лРеквизитОбъектаXML.nodeName;
лЗначениеXML = лРеквизитОбъектаXML.text;
//реквизит XML-объекта
лНомерСтрокиРеквизита = "";
// знаем тип значения, приводим к известному типу лТипДанных
// не знаем тип значения, приведем к строке, например, лТипДанных = Строка(100)
лЗначениеРеквизита = ПривестиЗначениеКТипуИзXML(лЗначениеXML, лТипДанных);
//дочерний набор объектов XML-объекта
Если лРеквизитОбъектаXML.childNodes().length() <> 0 Тогда
лСЗнИменаДочернихТиповОбъектовXML.ДобавитьЗначение(лИмяРеквизитаXML);
Иначе
Продолжить;
КонецЕсли;
//дочерние типы XML-объектов
Для р = 1 По лСЗнИменаДочернихТиповОбъектовXML.РазмерСписка() Цикл
лИмяДочернегоТипаОбъектовXML = лСЗнИменаДочернихТиповОбъектовXML.ПолучитьЗначение(р);
лДочернийТипОбъектовXML = лОбъектXML.selectSingleNode(лИмяДочернегоТипаОбъектовXML);
лДочерниеОбъектыXML = лДочернийТипОбъектовXML.childNodes();
Для лНомерДочернегоОбъектаXML = 1 По лДочерниеОбъектыXML.length() Цикл
лДочернийОбъектXML = лДочерниеОбъектыXML.item(лНомерДочернегоОбъектаXML - 1);
лРеквизитыДочернегоОбъектаXML = лДочернийОбъектXML.childNodes();
Для лНомерДочернегоСвойства = 1 По лРеквизитыДочернегоОбъектаXML.length() Цикл
лИмяДочернегоРеквизитаXML = лРеквизитыДочернегоОбъектаXML.item(лНомерДочернегоСвойства - 1).nodeName;
лЗначениеДочернегоXML = лРеквизитыДочернегоОбъектаXML.item(лНомерДочернегоСвойства - 1).text;
//реквизит XML-объекта
// знаем тип значения, приводим к известному типу лТипДанных
// не знаем тип значения, приведем к строке, например, лТипДанных = Строка(100)
лЗначениеДочернегоРеквизита = ПривестиЗначениеКТипуИзXML(лЗначениеДочернегоXML, лТипДанных);
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот