Всех категорически приветствую. Ну, и приступим.
Проблема:
Есть файл XML - стандартная выгрузка из Everest.
Структура файла примерно следующая:



Потребовалось разобрать файл и загрузить данные в 1С. В приведенном примере создавать объекты МД не станем, просто посмотрим варианты разбора файла.
В «Интернетах» большое количество примеров, как работать с XML из 1С, вот один из них.
&НаКлиенте
Процедура Сформировать(Команда)
Диалог = новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Если не Диалог.Выбрать() Тогда
Возврат
Иначе
ФЛ = НайтиФайлы(Диалог.Каталог,"*.xml",Ложь);
Для Каждого Ф Из ФЛ Цикл
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(Ф.ПолноеИмя);
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИмяУзла = Чтение.Имя; Сообщить("--" + ИмяУзла);
Пока Чтение.ПрочитатьАтрибут() Цикл
ТипУзла = Чтение.ТипУзла;
Имя = Чтение.Имя;
Значение = Чтение.Значение;
КонецЦикла;
ИначеЕсли
Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
Сообщить("Значение "+Чтение.Значение);
ИначеЕсли
Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Посмотрим, что данный код выводит:
Значение Системная плата
--Icon
Значение 42
--Item
--Title
Значение Тип ЦП
--Icon
Значение 80
--ID
Значение 517
--Value
Значение DualCore Intel Core 2 Duo, 2400 MHz
--Item
--Title
Значение Системная плата
--Icon
Значение 42
--ID
Значение 518
--Value
Значение Hewlett-Packard HP Compaq dc5800 Microtower
--Item
--Title
Значение Чипсет системной платы
--Icon
Значение 27
--ID
Значение 519
--Value
Значение Intel Bearlake Q33
--Item
Теперь представим, что нам нужно записывать данные по компьютеру в БД. Для этого придется написать большое количество условий, какие элементы забирать, а какие элементы пропускать.
Данный Цикл будет читать XML примерно в таком порядке:
1)

2)
3)

Из скринов схемы XML видно, что узлов «Page» у нас 2, а узлов Item примерно 30-40. Т.е. читая, таким образом, файл мы должны будем постоянно отслеживать узлы «Title» - чтобы понять, что за информация, и Узлы «Value» для получения значений из XML.
Теперь посмотрим, как можно работать с данным файлом при помощи выражений Xpath.
Не много теории, возможно, кому то будет полезно:
Ссылка на материал (http://easywebscripts.net/useful/xpath.php)
XPath описан в стандарте XPath 1.0. Согласно написанному там "XPath is a language for addressing parts of an XML document ... ". По русски можно сказать, что XPath нужен для разбора (parsing) XML документов. В приведенных ниже примерах рассматриваются наиболее часто употребимые (по мнению автора) конструкции языка.
1 Если путь начинается с символа /, то он представляет абсолютный путь к заданному элементу.
|
/AAA |
/AAA/DDD/BBB |
|
<AAA> |
<AAA> |
2 Если путь начинается с //, то будут выбраны все элементы, соответствующие указанному шаблону.
|
//BBB |
//DDD/BBB |
|
<AAA> |
<AAA> |
3 Символ '*' указывает, что надо выбрать все элементы, соответствующие пути перед ней.
|
/AAA/CCC/DDD/* |
/*/*/*/BBB |
//* |
|
<AAA> |
<AAA> |
<AAA> |
4 Выражение в квадратных скобках позволяет задавать более четкие критерии для элемента. Так число в квадратных скобках обозначает позицию элемента в выбранном множестве. Функция last() позволяет указать последний элемент в выборке.
|
/AAA/BBB[1] |
/AAA/BBB[last()] |
|
<AAA> |
<AAA> |
5 Атрибуты определяются префиксом @.
|
//@id |
//BBB[@id] |
//BBB[@name] |
|
<AAA> |
<AAA> |
<AAA> |
Значения атрибутов могут служить критерием при выборке. Функция normalize-space() удаляет пробелы в начале и конце параметра, а все последовательности пробельных символов заменяет одиночным пробелом.
|
//BBB[@id='b1'] |
//BBB[@name='bbb'] |
//BBB[normalize-space(@name)='bbb'] |
|
<AAA> |
<AAA> |
<AAA> |
6 Функция count() возвращает число элементов в указанном множестве.
|
//*[count(*)=3] выбрать все, имеющие три дочерних элемента |
//*[count(BBB)=2] выбрать все, имеющие два дочерних элемента BBB |
|
<AAA> |
<AAA> |
7 Функция name() возвращает имя элемента. Функция starts-with() возвращает истину, если строка первого аргумента начинается строкой второго аргумента. Функция contains() возвращает истину, если строка из первого аргумента содержит строку из второго.
|
//*[name()='BBB'] выбрать все с именем BBB, эквивалентно пути //BBB |
//*[starts-with(name(),'B')] выбрать все, имя которых начинается с B |
//*[contains(name(),'C')] выбрать все, имя которых содержит C |
|
<AAA> |
<AAA> |
<AAA> |
Функция string-length() возвращает число символов в строке.
|
//*[string-length(name()) = 3] выбрать все, имя которых состоит из трех символов |
//*[string-length(name()) < 3] |
//*[string-length(name()) > 3] |
|
<AAA> |
<AAA> |
<AAA> |
8 Несколько путей можно объединить с помощью разделителя |.
|
/AAA/EEE | //BBB |
/AAA/EEE | //DDD/CCC | /AAA | //BBB |
|
<AAA> |
<AAA> |
9 Ось self содержит только сам элемент (//GGG/self::*). Ось child содержит дочерние элементы контекстного узла. Ось child является осью, применяемой по умолчанию, и может быть опущена, т.е. /child::AAA эквивалентно /AAA, /child::AAA/child::BBB эквивалентно /AAA/BBB и т.д.
9 Ось descendant содержит потомков контекстного узла.
|
/AAA/BBB/descendant::* |
//CCC/descendant::* выбрать все, имеющие в качестве предка CCC |
//CCC/descendant::DDD выбрать DDD, имеющие в качестве предка CCC |
|
<AAA> Вступайте в нашу телеграмм-группу Инфостарт Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
См. также16500 руб. 02.09.2020 273409 1523 422 09.10.2025 11760 aximo 18 1 стартмани 16.05.2025 12570 158 zup_dev 32 3 стартмани 06.02.2025 6320 38 XilDen 26 |